为什么合成的复制分配运算符被定义为如果类有参考成员,则将其定义为删除
Why synthesized copy-assignment operator is defined as deleted if the class has a reference member?
在C 引物,第五版,§13.1.6:
如果成员的删除或无法访问的复制分配运算符,或者类具有const或参考成员。
本章的解释:
尽管我们可以为参考分配一个新值,但这样做会更改参考引用的对象的值。如果将复制分配操作员合成了此类类,则左侧操作数将继续参考与分配前相同的对象。它不会将同一对象与右侧操作数相同。因为不太可能需要此行为,因此合成的复制分配操作员被定义为如果类有参考成员。
。
复制类更改参考成员所指的对象。这不需要吗?为什么解释说" 不太可能需要"?
具体,
class A {
public:
A(int &n) : a(n) {}
private:
int &a;
};
int main() {
int n = 1;
A a(n);
/* Why is this allowed? */
A b(a);
/*
Why is this not allowed?
error C2280: 'A &A::operator =(const A &)': attempting to reference a deleted function
*/
b = a;
return 0;
}
创建后无法重新分配引用。这意味着如果类包含参考成员,则是不可能的。
复制构造函数是另一回事,因为参考可以分配在对象创建中。
相关文章:
- 为什么我不能在一个类的不同行中声明和定义成员变量?
- C++令牌定义成员
- 在没有类定义的标头中定义成员变量
- 如何在类的构造函数中定义成员向量的大小
- 如何在C++中动态定义成员函数
- C++ Boost.Serialization - 用户定义成员的非侵入式序列化
- C++类 - 使用公共变量并在类外定义成员函数
- G++ - 对已定义成员函数的未定义引用
- 在哪里以及如何定义成员变量?在头文件还是实现文件中?
- 是否可以修改STL并自定义成员函数
- 从 boost::mpl:vector 类型列表中定义成员变量
- 在构造对象时定义成员函数
- 为什么定义成员函数指针变量需要类名
- 复制构造函数中的 C++ 用户定义成员
- 如何根据类参数定义成员类运算符
- 使用指向未定义成员函数的指针时的未定义引用
- 如何在运行时定义成员数组大小
- C++-在模板类之外但在头中定义成员函数
- c++在不知道对象类型的情况下定义成员函数指针
- 在特定偏移量中定义成员的结构