C++编译错误 - 'operator ='不匹配

Ash*_*yan 4 c++ constructor variable-assignment

以下代码编译没有问题

class MyClass
{
public:
  MyClass() { std::cout << "Default Constructor!" << std::endl; }
  MyClass& operator=(const MyClass& m) { std::cout << "Copy assignment operator!" << std::endl; }
};

int main()
{
  MyClass a;
  MyClass d;
  d = MyClass(a);
}
Run Code Online (Sandbox Code Playgroud)

但当我更改赋值运算符参数为非const编译器打印错误时:

MyClass& operator=(MyClass& m) { std::cout << "Copy assignment operator!" << std::endl; }

error: no match for ‘operator=’ (operand types are ‘MyClass’ and ‘MyClass’)
Run Code Online (Sandbox Code Playgroud)

我想知道原因.提前致谢.

rod*_*igo 6

因为这MyClass&使你operator=没有const一个正确的赋值运算符.必须是operator=(const MyClass&)(或者operator=(MyClass)不要这样做,除非你知道你在做什么,复制 - 交换......).

否则,您的代码d = MyClass(a)无法编译,因为非const引用不会绑定到临时(r值),例如MyClass(a).

注意,即使没有const,d = a 也会编译一个代码,因为a它不是r值.但是,它仍然不是一个合适的赋值运算符.

  • @AshotKhachatryan:这在技术上是错误的:它是一个有效的成员函数,一个有效的运算符`=`重载,它不是**赋值运算符,因为它有额外的`const`要求. (2认同)