我正在尝试禁用某些成员函数和临时对象。为此,我将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&&)构造函数更匹配?
答案 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?)。