在C ++ Primer,第5版,§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;
}
答案 0 :(得分:4)
创建参考后,无法重新分配参考。这意味着如果类包含引用成员,则不可能创建一个正确的赋值运算符。
复制构造函数是另一回事,因为在创建对象时可以分配引用 。