如何禁止转让

时间:2015-12-09 18:26:40

标签: c++ c++11

是否有理由对#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> int main(int argc, char **argv, char **envp) { int fd[2]; pid_t pid; pipe(fd); pid = fork(); if (pid == -1) { exit(EXIT_FAILURE); } if (pid == 0) { /* child */ char *exe[]= { "/usr/bin/sort", NULL }; close(fd[0]); execve("/usr/bin/sort", exe, envp); } else { char *a[] = { "zilda", "andrew", "bartholomeu", NULL }; int i; close(fd[1]); for (i = 0; a[i]; i++) printf("%s\n", a[i]); } return 0; }

使用“规范”签名
operator=

而不仅仅是

class X {
  X& operator=(const X&) = delete;
  X& operator=(X&&) = delete;
};

当你想要做的只是class X { void operator=(X) = delete; }; 吗?

UPD:
另外,请考虑delete具有显式声明的移动或复制构造函数的情况。

X

在这种情况下,class X { public: X(X&&); }; op=(X&&)被隐式删除,但我想明确表示不允许分配。

1 个答案:

答案 0 :(得分:6)

不,没有技术理由使用规范的副本分配操作员签名。

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

  
      
  1. 除了声明它之外,隐式或显式引用已删除函数的程序是不正确的。   [注意:这包括隐式或显式调用函数并形成指针或指向成员的指针   到功能。它甚至适用于未进行潜在评估的表达式中的引用。 如果是一个功能   重载,只有在通过重载分辨率选择函数时才会引用它。 - 结束注释]
  2.   

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

这就是说使用规范签名的风格理由。存在这个问题的事实表明,阅读代码的任何人都可能知道其含义并假设它正在做一些特别的事情。为了便于阅读,我建议您使用熟悉的X& operator=(const X&) = delete;