对于operator=
,使用“canonical”签名有什么原因吗?
class X {
X& operator=(const X&) = delete;
X& operator=(X&&) = delete;
};
仅仅是而已
class X {
void operator=(X) = delete;
};
当你只想做的就是删除
它时,该怎么办?
更新:
此外,请考虑X
具有明确声明的移动或复制构造函数的情况。
class X {
public:
X(X&&);
};
在这种情况下,op=(X&&)
和op=(const X&)
被隐式删除了,但是我想明确表达赋值操作是不允许的。
X& operator=(const X&) = delete;
就足够了,不是吗?由于存在用户声明的复制赋值运算符,移动赋值运算符不会被隐式声明。 - PraetorianX& operator=(const X&) = delete;
足够简洁明了。 - Howard HinnantX& operator=(const X&) = delete;
更常见/熟悉,所以读者必须停下来想一想为什么这个签名不同寻常。最终,这归结为一个风格问题,我建议使用X& operator=(const X&) = delete;
。 - Howard Hinnant