use*_*635 2 c++ function-pointers reinterpret-cast
(5.2.10/6)C++ 03指向函数的指针可以显式转换为指向不同类型函数的指针.通过指向函数类型(8.3.5)的函数调用函数的效果是未定义的,该函数类型与函数定义中使用的类型不同.除了将"指向T1的指针"的rvalue转换为"指向T2的指针"类型(其中T1和T2是函数类型)并返回其原始类型产生原始指针值之外,这种指针转换的结果未指定.[注意:有关指针转换的更多详细信息,另请参见4.10.]
以下是我正在尝试做的事情,虽然很明显转换fp1为的结果fp2将产生一个原始指针,但在同一点上标准中的措辞是"The result of such a pointer conversion is unspecified"什么意思呢?
int f() { return 42; }
int main()
{
void(*fp1)() = reinterpret_cast<void(*)()>(f);
int(*fp2)() = reinterpret_cast<int(*)()>(fp1);
// Safe to call the function ?
fp2();
}
Run Code Online (Sandbox Code Playgroud)
是的,这是安全的.
reinterpret_cast只允许你将一个指针强制转换为另一个指针,但它并不能保证任何安全性,并且使用这种指针的结果是未指定的,除非它被强制转换回其原始类型.
提到的标准引用指定如果您将一种类型的函数指针类型转换为另一种类型并尝试通过它调用函数,那么结果是未定义的.
但是,
reinterpret_cast如果您将类型转换指针强制转换回原始类型,则可以保证指针格式正确.
您的代码尝试执行第二次,因此它是安全的.
您误读标准,"未指定"部分仅适用于其他转换:
除[特殊情况]外,未指定此类指针转换的结果.
那个[特例]是你转换回原始函数指针类型的那个,就像在你的例子中一样.在这种特殊情况下,转换会产生原始指针值,因此可以像在示例中一样使用它.
仅对于其他转换,结果未指定.
| 归档时间: |
|
| 查看次数: |
107 次 |
| 最近记录: |