已删除vs空副本构造函数

时间:2015-09-01 04:38:16

标签: c++ c++11 copy-constructor

已删除副本构造函数的示例:

<table>
  <tr>
    <td>odd</td>
    <td>odd</td>
  </tr>
  <tr>
    <td>even</td>
    <td>even</td>
  </tr>
  <tr>
    <td>odd</td>
    <td>odd</td>
  </tr>
  <tr>
    <td>even</td>
    <td>even</td>
  </tr>
  <tr>
    <td>odd</td>
    <td>odd</td>
  </tr>
</table>

他们在实践中是否做同样的事情(禁止复制对象)?为什么class A { public: // empty copy constructor A(const A &) {} } class B { public: // deleted copy constructor A(const A&) = delete; } 优于delete

3 个答案:

答案 0 :(得分:11)

  

他们在实践中是否做同样的事情(禁止复制对象)?

没有。尝试调用已删除的函数会导致编译时错误。可以调用空复制构造函数,它只是默认初始化类成员而不是进行任何复制。

  

为什么delete优于{}

因为你实际上不太可能真的想要那些奇怪的副本&#34;语义是一个空的拷贝构造函数会提供。

答案 1 :(得分:2)

一个原因是语法糖 - 不再需要在没有任何实现的情况下声明复制构造函数。另一种:只要禁止编译器创建一个,就不能使用已删除的复制构造函数,因此首先需要从该父级派生新类并提供复制构造函数。强制类用户创建自己的实现(包括特定库类的复制构造函数)非常有用。在C ++ 11之前,我们只有具有相似意图的纯虚函数,根据定义,构造函数不能是虚拟的。

默认或现有的空副本构造函数不会阻止错误地使用该类。有时,使用类似的语言功能强制执行策略。

答案 2 :(得分:2)

Empty Copy构造函数用于默认初始化类的成员。 虽然删除用于防止使用构造函数。