【问题标题】:Why doesn't std::function work in this situation?为什么 std::function 在这种情况下不起作用?
【发布时间】:2016-12-28 07:24:01
【问题描述】:

假设我有一个类型:

struct my_type
{
    double operator()(int a)
    {
        return 3.1415;
    }
};

然后我想把它包装在std::function 中。考虑两种不同的方法:

my_type m_t;
std::function<double(int)> f(std::move(m_t));
std::cout << f(4) << std::endl;

一切正常,如我所料,PI 的第一个数字被打印出来。那么第二种方法:

std::function<double(int)> ff(my_type()); 
std::cout << ff(4) << std::endl;

在我看来,这段代码绝对与第一个相同。 rvalue 作为 function 包装器的参数传递。但问题是,第二个代码无法编译!我真的不知道为什么会这样。

【问题讨论】:

    标签: c++ function c++11 stl most-vexing-parse


    【解决方案1】:

    这是著名的most vexing parse 问题。对于std::function&lt;double(int)&gt; ff(my_type());,您并没有像预期的那样声明std::function&lt;double(int)&gt; 类型的对象,而是一个名为ff 的函数,它返回一个std::function&lt;double(int)&gt; 类型的对象并有一个(未命名的)参数,它是一个指针函数返回类型 my_type 并且不接受任何输入。

    要解决此问题,您可以添加额外的括号或使用 C++11 支持的大括号(大括号可用于消除歧义,因为它不能用于参数列表)。例如

    std::function<double(int)> ff1((my_type())); 
    std::function<double(int)> ff2(my_type{}); 
    std::function<double(int)> ff3{my_type()}; 
    std::function<double(int)> ff4{my_type{}}; 
    

    LIVE

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-11-26
      • 2010-12-29
      • 1970-01-01
      • 2021-08-05
      • 2011-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多