为什么当static_cast(ing)一个函数作废*时,编译器的行为会有所不同?

时间:2019-03-24 00:18:25

标签: c++ function-pointers void-pointers static-cast

以下代码可在VSC ++ 2017中编译且没有任何错误,并且不会在gcc 7.3.0(error: invalid static_cast from type ‘int(int)’ to type ‘void*’ void* p = static_cast<void*>(func))中编译

#include <iostream>

int func(int x) { return 2 * x; }

int main() {

    void* p = static_cast<void*>(func);
    return 0;
}

1 个答案:

答案 0 :(得分:9)

函数只能隐式转换为函数指针。 函数指针在语言中严格意义上不是单词的 pointer ,它仅指对象的指针。

无法使用void*将函数指针转换为static_cast。所示程序格式错误。如果编译器未发出警告,则它不符合标准。未能编译格式错误的程序不会违反该标准。


在保证void*能够指向某个功能的系统上(例如POSIX),可以改用reinterpret_cast

void* p = reinterpret_cast<void*>(func);

但是,这对于缺乏保证的系统是不可移植的。 (我知道没有系统具有C ++编译器并且没有此保证,但这并不意味着该系统不存在。)

标准报价:

  

[expr.reinterpret.cast]

     

有条件地支持将函数指针转换为对象指针类型,反之亦然。含义   转换的定义是实现定义的,除非实现在两个实现中均支持转换   方向,将一种类型的prvalue转换为另一种类型的prvalue,然后转换回去,可能具有不同的cv限定条件,   将产生原始指针值。

请注意,此条件支持不会扩展到成员函数的指针。成员函数的指针不是函数指针。