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