为什么合成的复制分配运算符被定义为如果类有参考成员,则将其定义为删除

Why synthesized copy-assignment operator is defined as deleted if the class has a reference member?

本文关键字:定义 成员 参考 删除 如果 分配 复制 运算符 为什么      更新时间:2023-10-16

在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;
}

创建后无法重新分配引用。这意味着如果类包含参考成员,则是不可能的

复制构造函数是另一回事,因为参考可以分配在对象创建中。