首先,我在函数对象的参数列表中使用了一个类。这是一个简化版本,说明了要点。
class X
{
public:
void zz(int a) const
{
std::cout << "X:zz, a = " << a << "." << std::endl;
}
};
class Y
{
public:
void operator()(const X& x)
{
x.zz(17);
}
};
void test_it
{
X my_x;
Y my_y;
std::function<void(const X&)> f1(my_y);
f1(my_x); // OK
std::function<void(const X&)> f2(Y());
f2(my_x); // cannot convert argument 1 from X to Y
std::function<void(const X&)> f3(Y);
f3(my_x); // cannot convert argument 1 from X to Y
std::function<void(const X&)> f4(Y{});
f4(my_x); // OK
}
第一个示例f1创建Y的一个实例my\u Y,并使用该实例创建f1。这很好用。(Y的内容被移动到std::函数构造函数中的std::函数中。)
第二次尝试f2在f2的构造函数中构造Y的实例。当我尝试用f2(my\u x)调用它时,编译器抱怨它无法将参数1(my\u x)从x转换为Y。
第三次尝试,f3,我只是在f3的std::function构造中命名函数对象类,失败的方式与f2相同。
最后,f4起作用。在本例中,我使用空的初始值设定项列表构造函数对象Y。
也许有一个简单的解释,但我不明白为什么这两个用例不能编译。特别是使用Y()的f2和使用Y{}的f4似乎与我几乎相同。