函数指针不是普通的数据指针,不能存储在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
。 - Some programmer dudestd::function
是一种用于存储任意可调用对象的类型擦除容器,而不是函数指针的替代品... - Michael Kenzelstd::function
。它非常适合存储“多态”函数(即具有正确签名的任何内容,即使它包含状态,如某些lambda函数),但这也会增加一些不必要的开销。指向函数的指针是POD类型,而std::function
则不是。 - Matthewvoid*
指向它,因此在这个问题的上下文中,std::function
似乎正是他们正在寻找的。我确实同意 SPD 对函数指针的一般性否定是不合理的。 - eerorika