空和已删除副本构造函数的示例:
<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
?
答案 0 :(得分:11)
他们在实践中是否做同样的事情(禁止复制对象)?
没有。尝试调用已删除的函数会导致编译时错误。可以调用空复制构造函数,它只是默认初始化类成员而不是进行任何复制。
为什么
delete
优于{}
?
因为你实际上不太可能真的想要那些奇怪的副本&#34;语义是一个空的拷贝构造函数会提供。
答案 1 :(得分:2)
一个原因是语法糖 - 不再需要在没有任何实现的情况下声明复制构造函数。另一种:只要禁止编译器创建一个,就不能使用已删除的复制构造函数,因此首先需要从该父级派生新类并提供复制构造函数。强制类用户创建自己的实现(包括特定库类的复制构造函数)非常有用。在C ++ 11之前,我们只有具有相似意图的纯虚函数,根据定义,构造函数不能是虚拟的。
默认或现有的空副本构造函数不会阻止错误地使用该类。有时,使用类似的语言功能强制执行策略。
答案 2 :(得分:2)
Empty Copy构造函数用于默认初始化类的成员。 虽然删除用于防止使用构造函数。