函数指针可以显式转换为不同类型的函数指针 . [注意:通过指向函数类型([dcl.fct])的指针调用函数的效果与函数定义中使用的类型不同是未定义的 . - 结束注释]除了将“指向T1的指针”类型的prvalue转换为“指向T2的指针”类型(其中T1和T2是函数类型)并返回其原始类型,产生原始指针值,这样的结果指针转换未指定 . [注意:有关指针转换的更多详细信息,另请参阅[conv.ptr] . - 结束说明]
在我看来,这个说明是说下面的代码片段(参见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)();
}
1 回答
注释的要点是函数指针可以转换,但结果可能不会被使用 . 但是,结果可以在使用前转换回原始类型 . 这个想法是将一个函数指针类型中的一个存储在单个变量中(不需要
union
)以及指示(某种程度上)实际函数类型的标记 .请注意,您根本无法将函数指针可移植地转换为对象指针(例如,
void*
) . 但是,POSIX assumes you can do this,所以它经常工作 .