为什么在带有引用字段的类中隐式删除了复制运算符?

时间:2019-06-21 19:56:42

标签: c++

我正在尝试为一个类(我们将称其为A)做一个移动操作符,该类包含对另一个类(我们将称其为B)的另一个引用,该类的副本构造函数为隐式删除,因为它包含另一个引用。下面显示了一个简单的示例。

class B
{
   public:
    int & num;

    B(int & _num) : num(_num) {}
};

class A
{
   public:
    B & b;

    A(B & _b) : b(_b) {}
    A & operator=(A && other)
    {
        b = other.b; //< Error
        return *this;
    }
};

当我尝试编译时,出现此错误:

error: object of type 'B' cannot be assigned because its copy assignment operator is implicitly deleted b = other.b;

几个问题:

1)为什么在B中删除隐式副本分配运算符?甚至为此A

2)如果我要复制引用而不是对象,B是否具有复制构造函数或运算符怎么办?我做的那部分不对吗?

1 个答案:

答案 0 :(得分:3)

  

2)如果我要复制引用而不是对象,那么B是否具有复制构造函数或运算符怎么办?我做的那部分不对吗?

引用的副本分配将分配引用的对象。无法重新放置引用,即无法使引用引用另一个对象。

  

1)为什么要在B中删除隐式副本分配运算符?甚至是A?

因为它们都有参考成员。

  

为什么在带有引用字段的类中隐式删除复制运算符?

由于所引用对象的分配是类的赋值运算符的违反直觉的默认行为,因此不会隐式生成此类赋值运算符。