如果类具有引用成员,为什么合成复制赋值运算符被定义为已删除?

时间:2018-02-06 04:09:32

标签: c++ c++11

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

1 个答案:

答案 0 :(得分:4)

创建参考后,无法重新分配参考。这意味着如果类包含引用成员,则不可能创建一个正确的赋值运算符。

复制构造函数是另一回事,因为在创建对象时可以分配引用