[expr.reinterpret.cast] / 6中以下注释的含义是什么?

[expr.reinterpret.cast]/6

函数指针可以显式转换为不同类型的函数指针 . [注意:通过指向函数类型([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)

3 years ago

注释的要点是函数指针可以转换,但结果可能不会被使用 . 但是,结果可以在使用前转换回原始类型 . 这个想法是将一个函数指针类型中的一个存储在单个变量中(不需要 union )以及指示(某种程度上)实际函数类型的标记 .

请注意,您根本无法将函数指针可移植地转换为对象指针(例如, void* ) . 但是,POSIX assumes you can do this,所以它经常工作 .