为什么在C ++中不允许将static_cast从int(*)(int)转换为void *?

时间:2020-03-12 21:49:59

标签: c++ casting void-pointers

请考虑以下代码:

int f(int i){return i*i;};

int main() {

    void* p = static_cast<void*>(&f);

    return 0;
}

您可以see here编译代码。 为什么在C ++中不允许static_castint (*)(int)void*

1 个答案:

答案 0 :(得分:5)

您不能使用void*来将函数指针转换为static_cast,但是可以使用reinterpret_cast来实现。

这是有条件支持的,具有实现定义的语义,只是将其强制转换回原始函数指针类型会产生相同的指针值,因此可以使用它再次调用该函数。

可能不允许使用以这种方式获得的void*做其他任何事情,但是您需要查看编译器文档来确定这一点。 (编译器应该记录实现定义的行为,但通常做得不好或根本没有做。)

尤其是在POSIX系统和Windows上,始终支持此强制转换。

相关问题