为什么C ++不允许static_cast <function_type_of_f>(f)?

时间:2016-09-03 05:13:32

标签: c++ function compiler-errors type-conversion standards

#include <functional>

int f(int x)
{
    return 0;
}

int main()
{
    std::function<int(int)> fn1 = f; // ok
    std::function<int(int)> fn2 = static_cast<int(*)(int)>(f); // ok

    //
    // error C2066: cast to function type is illegal
    //
    std::function<int(int)> fn3 = static_cast<int(int)>(f); 
}

我的C ++编译器是VS 2015 Update 3。

我只是想知道:

为什么C ++标准不允许std::function<int(int)> fn3 = static_cast<int(int)>(f);

背后的理由是什么?

1 个答案:

答案 0 :(得分:3)

这可能是因为您不能拥有函数类型的对象(在标准中使用的对象的定义下:存储区域)。演员需要创建int(int)类型的对象,但是你不能拥有那种类型的对象(函数不是对象)。

但是,您可以转换为函数指针,因为您可以拥有函数指针类型的对象。实际上,static_cast的函数参数在被转换为现在相同类型之前已经衰减到函数指针(就像数组很容易衰减到指针一样)。这是因为[expr.static.cast] / 8:

  

左值到右值(4.1),数组到指针(4.2)和函数到指针(4.3)转换应用于操作数。

长话短说,fn2相当于fn1并且使用了多余的强制转换,因为f在初始化fn1时已经转换为函数指针。