我正在尝试为一个类(我们将称其为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
是否具有复制构造函数或运算符怎么办?我做的那部分不对吗?
答案 0 :(得分:3)
2)如果我要复制引用而不是对象,那么B是否具有复制构造函数或运算符怎么办?我做的那部分不对吗?
引用的副本分配将分配引用的对象。无法重新放置引用,即无法使引用引用另一个对象。
1)为什么要在B中删除隐式副本分配运算符?甚至是A?
因为它们都有参考成员。
为什么在带有引用字段的类中隐式删除复制运算符?
由于所引用对象的分配是类的赋值运算符的违反直觉的默认行为,因此不会隐式生成此类赋值运算符。