在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;
}发布于 2018-02-06 04:56:12
一旦创建引用,就不能重新分配它。这意味着如果类包含引用成员,就不可能生成适当的赋值操作符。
复制构造函数是另一回事,因为引用可以在对象创建时分配。
https://stackoverflow.com/questions/48635366
复制相似问题