删除与空复制构造函数
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 用于防止使用构造函数。
空和删除拷贝构造函数的例子:
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 用于防止使用构造函数。