C++11 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; } 如果出现编译器错误,这将按预期工作,但当我尝试使用构造函数时,它不会生成编

我试图禁用对临时对象使用某些成员函数。为了实现这一点,我将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(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{}
,会发生什么?另请参阅,谢谢,这是最令人烦恼的解析。这是我肯定会改变语法,打破向后兼容性的东西。