【发布时间】:2020-02-04 12:21:54
【问题描述】:
指向函数的指针不是纯数据指针,因为它们不能存储在 void* 指针中。 尽管如此,我似乎可以将函数指针的副本存储在动态内存中 (在 gcc 和 clang 中)就像下面的代码一样。根据 C++ 标准,这样的代码是否合法, 或者这可能是某种编译器扩展?
此外,指向函数指针的结果指针表现为普通数据指针:我可以 将其存储在 void* 中并通过 static_cast 从 void* 中检索它。标准是否保证这种行为?
int main()
{
extern void fcn();
void (*fcnPtr)() = &fcn;
void (**ptrToFcnPtr)() = nullptr;
//Make the copy of fcnPtr on the heap:
ptrToFcnPtr = new decltype(fcnPtr)(fcnPtr);
//Call the pointed-to function :
(**ptrToFcnPtr)();
//Save the pointer in void* :
void *ptr = ptrToFcnPtr;
//retrieve the original ptr:
auto myPtr = static_cast< void(**)() > (ptr) ;
//free memory:
delete ptrToFcnPtr ;
}
【问题讨论】:
-
请不要使用原始函数指针。请改用
std::function。 -
您不需要将
new转换为void*。void* ptr = &fcnPtr;也同样有效,因为fcnPtr是一个对象,而不是一个函数。 -
@Someprogrammerdude
std::function是一个类型擦除的容器,用于存储任意可调用对象,而不是真正的函数指针的替代品…… -
(@Someprogrammerdude) 请不要盲目使用/推荐
std::function。它能够存储“多态”函数(即任何具有正确签名的东西,即使它包含某些 lambda 的状态)的能力非常好,但这也增加了可能不需要的开销。指向函数的指针是 POD。std::function不是。 -
@Matthew 公平地说,Adrian 正在询问动态分配指向函数的指针并使用类型擦除
void*指向它,所以在这个问题的上下文中std::function似乎是正是他们想要的。我同意 SPD 对函数指针的普遍解雇是不合理的。
标签: c++