可能重复:
隐式复制构造函数/赋值运算符
C++ 的行为 - 自动生成默认 ctor、复制 ctor 和默认赋值运算符的条件?
C++编译器总是提供重载的赋值运算符是真的吗?c++编译器不提供的情况有哪些?
可能重复:
隐式复制构造函数/赋值运算符
C++ 的行为 - 自动生成默认 ctor、复制 ctor 和默认赋值运算符的条件?
C++编译器总是提供重载的赋值运算符是真的吗?c++编译器不提供的情况有哪些?
任何 C++ 编译器都会隐式提供赋值/复制赋值(=
)运算符,除非您const
在类中拥有或引用成员。
如果const
成员编译器无法提供=
,因为这会破坏const
初始化后不修改成员的约定。
如果引用成员编译器不提供=
,因为它将它留给类的用户来决定适当的行为。
C++编译器总是提供重载的赋值运算符是真的吗?
如果您不声明自己的赋值运算符,编译器将隐含地为您声明一个(总是)。如果你使用它,那么编译器也会隐式定义它(总是)。
Als 的回答中显示了一个常见的误解,即在某些情况下不会对其进行定义。那是错误的,类型是否具有常量成员或引用根本不重要,编译器会声明并定义它。这些情况的情况是隐式定义的编译器将无法编译。
如果您在编译器中尝试这样做,错误将不会指向缺少的赋值运算符,而是在编译隐式定义的赋值时出错。