【发布时间】:2019-05-10 15:17:21
【问题描述】:
函数指针可以显式转换为函数指针 不同类型的。 [ 注意:通过调用函数的效果 指向函数类型([dcl.fct])的指针,它与 函数定义中使用的类型未定义。 — 尾注 ] 除了将类型为“指向 T1 的指针”的纯右值转换为类型 “指向 T2 的指针”(其中 T1 和 T2 是函数类型)并返回到它的 原始类型产生原始指针值,这样的结果 未指定指针转换。 [ 注意:另见 [conv.ptr] 指针转换的更多细节。 — 尾注 ]
在我看来,这个注释是说下面的 sn-p(参见 demo)具有未定义的行为。它是否正确?或者除此之外还有什么别的吗?
#include<iostream>
void f() { std::cout << "function returning void\n"; }
int g() { std::cout << "function returning int\n"; return 1; }
int main(){
void (*pf)() = f;
reinterpret_cast<int(*)()>(pf)();
}
【问题讨论】:
-
这是正确的。未定义的行为。
-
而且可能非常糟糕,因为它期望堆栈上不存在的东西。完全堆栈损坏。
标签: c++ casting language-lawyer function-pointers reinterpret-cast