重载赋值运算符是否始终由C ++编译器提供?

时间:2012-06-07 17:57:39

标签: c++ operator-overloading assignment-operator constructor-overloading

  

可能重复:
  behaviour of the implicit copy constructor / assignment operator
  C++ - conditions for automatic generation of default ctor, copy ctor,and default assignment operator?

重载的赋值运算符总是由C ++编译器提供吗? c ++编译器没有提供它的情况是什么?

2 个答案:

答案 0 :(得分:2)

任何C ++编译器都会隐式提供赋值/复制赋值(=)运算符,除非您的类中有const或引用成员。

如果const成员编译器无法提供=,因为这会破坏初始化后不修改const成员的合同。

如果引用成员编译器不提供=,因为它将它留给类的用户来决定适当的行为。

答案 1 :(得分:1)

  

重载的赋值运算符总是由C ++编译器提供。

如果您没有声明自己的赋值运算符,编译器将隐式声明一个(总是)。如果你使用它,那么编译器也将隐式定义它(总是)。

在Als的回答中有一个常见的误解,即在某些情况下不会定义。那是错误,无论类型是否具有常量成员或引用都无关紧要,编译器将声明定义它。这些情况的情况是隐式定义的编译器将无法编译。

如果在编译器中尝试,则错误不会指向缺少的赋值运算符,而是指向编译隐式定义的赋值时的错误。