【问题标题】:Why doesn't C++ allow to static_cast<function_type_of_f>(f)?为什么 C++ 不允许 static_cast<function_type_of_f>(f)?
【发布时间】:2017-01-11 05:22:51
【问题描述】:
#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&lt;int(int)&gt; fn3 = static_cast&lt;int(int)&gt;(f);

背后的原理是什么?

【问题讨论】:

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


    【解决方案1】:

    这大概是因为您不能拥有函数类型的对象(根据标准中使用的对象定义:存储区域)。强制转换需要创建 int(int) 类型的对象,但您不能拥有该类型的对象(函数不是对象)。

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

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

    长话短说,fn2 等效于带有冗余转换的 fn1,因为在初始化 fn1 时,f 已经转换为函数指针。

    【讨论】:

    • OP 的代码不会在任何地方投射 std::function
    • @T.C.,这更有意义。哎呀。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-24
    • 1970-01-01
    • 2013-07-07
    • 2013-06-12
    • 1970-01-01
    • 2012-01-27
    相关资源
    最近更新 更多