想象一下我有一个类型:
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
包装器的参数传递。但问题是,第二个代码没有编译!我真的不知道为什么会这样。
答案 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{}};