请考虑以下代码:
int f(int i){return i*i;};
int main() {
void* p = static_cast<void*>(&f);
return 0;
}
正如您在这里看到的,代码并没有编译。为什么C++中不允许从int (*)(int)
到void*
的static_cast
?
不能使用static_cast
将函数指针强制转换为void*
,但可以使用reinterpret_cast
。
这是有条件支持的,实现定义了语义,只是强制转换回原始函数指针类型会产生相同的指针值,以便可以再次使用它来调用函数。
可能您不允许对以这种方式获得的void*
执行任何其他操作,但您需要查看编译器文档来确定这一点。(编译器应该记录实现定义的行为,但它通常做得不好或根本不好。(
特别是在POSIX系统和Windows上,始终支持此强制转换。