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

时间:2018-12-09 14:55:37

标签: c++ casting language-lawyer function-pointers reinterpret-cast

[expr.reinterpret.cast]/6

  

可以将函数指针显式转换为函数指针   不同类型的。 [注意:通过调用函数的效果   指向与函数类型不同的函数类型([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)();
}

1 个答案:

答案 0 :(得分:1)

注释的重点是可以转换函数指针,但可能无法使用结果。但是,可以在使用前将结果 back 转换为原始类型。这个想法是将几种函数指针类型之一存储在单个变量中(不需要union),以及一个指示(以某种方式)实际函数类型的标记。

请注意,您根本无法将函数指针完全转换为 object 指针(例如void*)。但是,POSIX assumes you can do this因此非常有用。