已删除的r值引用的成员函数和构造函数的行为方式不同

时间:2014-03-23 10:19:33

标签: 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(X const&);
  A(X&&) = delete;
};

int main()
{
    X x;

    A b(X()); // using deleted constructor
    A c(x);

    return 0;
}

为什么要编译? A(X const&)构造函数是否比A(X&&)构造函数更匹配?

1 个答案:

答案 0 :(得分:0)

最令人烦恼的解析:

struct X {};

struct A
{
  A(X const&);
  A(X&&) = delete;
};

int main()
{
    X x;

    A b(X()); // using deleted constructor
} 

A b(X())不会调用构造函数,而是声明一个函数(Most vexing parse: why doesn't A a(()); work?)。