A()= A() – 为什么编译?

class A {}; int main() { A() = A(); return 0; } 

为什么这个代码编译? 在赋值运算符左侧不应该有一些错误,应该放在左值? 是()左值? g ++ 4.7版本

对于内置types,您应该是正确的:内置的赋值运算符需要在左边修改左值

但是,这不是使用内置运算符,而是由类隐式声明的超载。 这是一个成员函数,相当于

 A().operator=(A()); 

成员函数可以在rvalues调用

如果你真的想要,你可以使它不能用C ++ 11编译:

 class A { template <typename T> void operator=(T&&) && = delete; // no op= for rvalues // generate other special members normally A() = default; A(A const&) = default; A(A&&) = default; ~A() = default; // op= only for lvalues A& operator=(A&&) & = default; A& operator=(A const&) & = default; }; int main() { A() = A(); // error return 0; } 

( 现场示例 )

注意在各种operator=forms声明结尾处的&&& (又名ref-qualifiers)。 这使得这些声明分别被select为左值和右值。 然而,右值版本,当通过重载决定select时,会导致程序被格式化,因为它被删除。

默认生成的运算符=,但是,没有任何ref-qualifier,这意味着它可以被称为左值和右值; 这就是为什么问题中的代码编译,即使A()是一个右值。

C ++编译器为所有的类提供了一个默认的构造函数,当你说A()= A(); 它只是调用带有无名对象的构造函数,函数返回对构造对象的引用(隐式)。 而已…