是否有理由使用"规范"签名 operator=
class X { X& operator=(const X&) = delete; X& operator=(X&&) = delete; };
而不仅仅是
class X { void operator=(X) = delete; };
什么时候你想做的就是delete
它?
Upd:
另外,考虑X
具有显式声明的移动或复制构造函数的情况.
class X { public: X(X&&); };
在那种情况下op=(X&&)
并被op=(const X&)
隐式删除,但我想明确表示不允许赋值.
不,没有技术理由使用规范的复制赋值运算符签名.
如标准所示,[dcl.fct.def.delete]§8.4.3:
除了声明它之外,隐式或显式引用已删除函数的程序是不正确的.[注意:这包括隐式或显式调用函数并形成指向函数的指针或指向成员的指针.它甚至适用于未进行潜在评估的表达式中的引用.如果函数重载,则仅在通过重载决策选择函数时才引用它. - 结束说明]
因此,在这种情况下operator=
,只有在编译器找到更好的重载决策时才可以使用已删除函数的名称.但是,这样的重载不可能存在,X
并且const X&
作为参数无法区分([over.ics.rank]§13.3.3.2)并且忽略返回值.
话虽这么说,有是一个文体理由使用规范签名.存在这个问题的事实表明,阅读代码的人可能不知道其含义,并认为它正在做一些特别的事情.为了便于阅读,我建议您使用熟悉的X& operator=(const X&) = delete;
.