删除与空复制构造函数

Deleted vs empty copy constructor

删除拷贝构造函数的例子:

class A
{
public:
    // empty copy constructor
    A(const A &) {}
}

class B
{
public:
    // deleted copy constructor
    A(const A&) = delete;
}

他们在实践中是否也这样做(禁用对象复制)?为什么 delete{} 好?

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

默认或现有的空复制构造函数不会阻止 class 的不正确使用。有时值得使用这样的语言功能来执行策略。

Are they doing the same in practice (disables copying for object)?

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

Why delete is better than {}?

因为您实际上不太可能想要空复制构造函数提供的奇怪 "copy" 语义。

Empty Copy构造函数用于默认初始化class的成员。 而 delete 用于防止使用构造函数。