函数指针不是普通的数据指针,因为它们不能存储在 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 ;
}
Run Code Online (Sandbox Code Playgroud)
Mic*_*zel 27
虽然函数指针不是对象指针,但“指向某种类型的函数的指针”仍然是对象类型[basic.types]/8。因此,函数指针本身就是对象,只是它们指向的东西不是。
因此,您肯定可以通过 new 表达式创建函数指针类型的对象……
因为它们(函数指针)不能存储在 void* 指针中。
实际上,void*
有条件地支持将函数指针存储为 a 。这意味着它可以或不能存储取决于语言实现。如果语言实现支持动态加载,则void*
可能支持转换函数指针。GCC、Clang 和 MSVC 都支持这个:
reinterpret_cast<void*>(&function);
Run Code Online (Sandbox Code Playgroud)
新分配一个指向函数的指针是否合法?
当然。所有的指针,包括函数指针,都是对象,所有的对象都可以动态分配。
此外,指向函数指针的结果指针表现为普通数据指针
函数指针是一个对象。指向函数指针的指针不仅“表现为”,而且是指向对象的指针。
我可以将它存储在 void* 中并通过 static_cast 从 void* 中检索它。标准是否保证这种行为?
允许在指向 void 的指针和指向对象的指针之间进行转换,是的。并且往返转换保证产生原始指针。