为什么std :: function在这种情况下不起作用?

时间:2016-12-28 07:24:01

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

想象一下我有一个类型:

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包装器的参数传递。但问题是,第二个代码没有编译!我真的不知道为什么会这样。

1 个答案:

答案 0 :(得分:10)

这是着名的most vexing parse问题。对于std::function<double(int)> ff(my_type());,您并未按预期声明类型为std::function<double(int)>的对象,而是声明名为ff的函数,该函数返回std::function<double(int)>类型的对象并具有一个(未命名的)参数,它是函数返回类型my_type并且不输入的指针。

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

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