的空和例子删除拷贝构造函数:删除VS空拷贝构造函数
class A
{
public:
// empty copy constructor
A(const A &) {}
}
class B
{
public:
// deleted copy constructor
A(const A&) = delete;
}
他们在做同样的在实践中(禁止复制的对象)?为什么delete
比{}
更好?
的空和例子删除拷贝构造函数:删除VS空拷贝构造函数
class A
{
public:
// empty copy constructor
A(const A &) {}
}
class B
{
public:
// deleted copy constructor
A(const A&) = delete;
}
他们在做同样的在实践中(禁止复制的对象)?为什么delete
比{}
更好?
他们在实践中是否做了同样的事情(禁止复制对象)?
否。试图调用已删除的函数会导致编译时错误。一个空的拷贝构造函数可以被调用,它只是默认的初始化类成员,而不是做任何复制。
为什么
delete
比{}
更好?
因为你不太可能真的想要一个空的拷贝构造函数提供的奇怪的“复制”语义。
一个原因是语法糖 - 不再需要在没有任何实现的情况下声明拷贝构造函数。另一种:只要编译器被禁止创建,就不能使用已删除的拷贝构造函数,因此首先需要从该父类派生新的类并提供拷贝构造函数。强制类用户创建它自己的实现是有用的,包括特定库类的复制构造函数。在C++ 11之前,我们只有具有类似意图的纯虚函数,而构造函数根据定义不能是虚拟的。
默认或现有的空副本构造函数不会阻止错误使用该类。有时候用这样的语言功能强制执行策略是值得的。
空复制构造函数用于默认初始化类的成员。 删除用于防止使用构造函数。
'public:A(const A&){}'几乎肯定是一个错误 –
@MattMcNabb它经常发生在旧的(pre C++ 11)代码 – vladon
我从来没有见过它。经常发生的事情是'private:A(const A&);'。你的版本不会禁用复制,它会默默地允许复制(并且可能根据类成员的不同而做错误的事情)。 –