当前位置:  开发笔记 > 编程语言 > 正文

如何禁止转让

如何解决《如何禁止转让》经验,为你挑选了1个好方法。

是否有理由使用"规范"签名 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&)隐式删除,但我想明确表示不允许赋值.



1> nwn..:

不,没有技术理由使用规范的复制赋值运算符签名.

如标准所示,[dcl.fct.def.delete]§8.4.3:

    除了声明它之外,隐式或显式引用已删除函数的程序是不正确的.[注意:这包括隐式或显式调用函数并形成指向函数的指针或指向成员的指针.它甚至适用于未进行潜在评估的表达式中的引用.如果函数重载,则仅在通过重载决策选择函数时才引用它. - 结束说明]

因此,在这种情况下operator=,只有在编译器找到更好的重载决策时才可以使用已删除函数的名称.但是,这样的重载不可能存在,X并且const X&作为参数无法区分([over.ics.rank]§13.3.3.2)并且忽略返回值.

话虽这么说,有一个文体理由使用规范签名.存在这个问题的事实表明,阅读代码的人可能知道其含义,并认为它正在做一些特别的事情.为了便于阅读,我建议您使用熟悉的X& operator=(const X&) = delete;.

推荐阅读
pan2502851807
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有