可以将函数指针显式转换为函数指针 不同类型的。 [注意:通过调用函数的效果 指向与函数类型不同的函数类型([dcl.fct])的指针 函数定义中使用的类型未定义。 —注释] 除了将“ pointer to 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)();
}
答案 0 :(得分:1)
注释的重点是可以转换函数指针,但可能无法使用结果。但是,可以在使用前将结果 back 转换为原始类型。这个想法是将几种函数指针类型之一存储在单个变量中(不需要union
),以及一个指示(以某种方式)实际函数类型的标记。
请注意,您根本无法将函数指针完全转换为 object 指针(例如,void*
)。但是,POSIX assumes you can do this因此非常有用。