2015-09-01 174 views
0

例子删除拷贝构造函数:删除VS空拷贝构造函数

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

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

他们在做同样的在实践中(禁止复制的对象)?为什么delete{}更好?

+5

'public:A(const A&){}'几乎肯定是一个错误 –

+0

@MattMcNabb它经常发生在旧的(pre C++ 11)代码 – vladon

+5

我从来没有见过它。经常发生的事情是'private:A(const A&);'。你的版本不会禁用复制,它会默默地允许复制(并且可能根据类成员的不同而做错误的事情)。 –

回答

10

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

否。试图调用已删除的函数会导致编译时错误。一个空的拷贝构造函数可以被调用,它只是默认的初始化类成员,而不是做任何复制。

为什么delete{}更好?

因为你不太可能真的想要一个空的拷贝构造函数提供的奇怪的“复制”语义。

2

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

默认或现有的空副本构造函数不会阻止错误使用该类。有时候用这样的语言功能强制执行策略是值得的。

1

空复制构造函数用于默认初始化类的成员。 删除用于防止使用构造函数。