在C++中,如果一个类有一个引用数据成员,则编译器不会自动生成默认的赋值运算符。为什么呢?
在一个仅限会员的论坛上看到了关于此问题的讨论。由于大多数程序员并不熟悉答案,因此我想在这里发布答案并分享。
根据C++标准草案N3337 §12.8.23:
如果类X具有以下特征,则默认的复制/移动赋值运算符被定义为删除:
- 具有非平凡对应赋值运算符的变体成员,并且X是类似联合体的类;或者
- 常量非类类型(或其数组)的非静态数据成员;或者
- 引用类型的非静态数据成员;或者
- 类类型M(或其数组)的非静态数据成员,由于重载分辨率(13.3),应用于M的相应赋值运算符导致歧义或函数被删除或从默认赋值运算符中无法访问;或者
- 不能被复制/移动的直接或虚拟基类B,因为重载分辨率(13.3),作为B的相应赋值运算符,导致歧义或函数被删除或从默认赋值运算符中无法访问;或者
- 对于移动赋值运算符,具有没有移动赋值运算符并且不是平凡可复制的类型的非静态数据成员或直接基类,或任何直接或间接虚拟基类。