新分配一个指向函数的指针是否合法?

Adr*_*ian 33 c++

函数指针不是普通的数据指针,因为它们不能存储在 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 表达式创建函数指针类型的对象……


eer*_*ika 9

因为它们(函数指针)不能存储在 void* 指针中。

实际上,void*有条件地支持将函数指针存储为 a 。这意味着它可以或不能存储取决于语言实现。如果语言实现支持动态加载,则void*可能支持转换函数指针。GCC、Clang 和 MSVC 都支持这个:

reinterpret_cast<void*>(&function);
Run Code Online (Sandbox Code Playgroud)

新分配一个指向函数的指针是否合法?

当然。所有的指针,包括函数指针,都是对象,所有的对象都可以动态分配。

此外,指向函数指针的结果指针表现为普通数据指针

函数指针是一个对象。指向函数指针的指针不仅“表现为”,而且指向对象的指针。

我可以将它存储在 void* 中并通过 static_cast 从 void* 中检索它。标准是否保证这种行为?

允许在指向 void 的指针和指向对象的指针之间进行转换,是的。并且往返转换保证产生原始指针。