C++11 r值引用的已删除成员函数和构造函数的行为不同
我试图禁用对临时对象使用某些成员函数。为了实现这一点,我将r值引用重载声明为已删除:C++11 r值引用的已删除成员函数和构造函数的行为不同,c++11,C++11,我试图禁用对临时对象使用某些成员函数。为了实现这一点,我将r值引用重载声明为已删除: struct X {}; struct A { A(); void f(X const& x); void f(X&&) = delete; }; int main() { A a; X x; a.f(X()); a.f(x); return 0; } 如果出现编译器错误,这将按预期工作,但当我尝试使用构造函数时,它不会生成编
struct X {};
struct A
{
A();
void f(X const& x);
void f(X&&) = delete;
};
int main()
{
A a;
X x;
a.f(X());
a.f(x);
return 0;
}
如果出现编译器错误,这将按预期工作,但当我尝试使用构造函数时,它不会生成编译错误:
struct X {};
struct A
{
A(X const&);
A(X&&) = delete;
};
int main()
{
X x;
A b(X()); // using deleted constructor
A c(x);
return 0;
}
这是为什么?A(X常量&)构造函数比A(X&&)构造函数更匹配吗?最令人烦恼的解析:
struct X {};
struct A
{
A(X const&);
A(X&&) = delete;
};
int main()
{
X x;
A b(X()); // using deleted constructor
}
ab(X())
不调用构造函数,而是声明一个函数()。如果将ab(X())
替换为ab{X{}
,会发生什么?另请参阅,谢谢,这是最令人烦恼的解析。这是我肯定会改变语法,打破向后兼容性的东西。