2011-04-11 81 views

回答

5

这里的答案是正确的,但不完整。它们对于C++ 98和C++ 03是正确的。在C++ 11中,如果您声明了移动构造函数或移动赋值运算符,则不会获得复制构造函数。此外,如果您已声明了复制赋值运算符或析构函数,则不建议使用隐式生成复制构造函数。 12.8 class.copy]:

如果类定义不明确 声明一个拷贝构造函数, 没有用户声明的举动 构造,并没有 用户声明的举动分配 运营商,一个拷贝构造函数是 隐式声明为默认 (8.4.2)。如果该类有 用户声明的复制分配运算符 或用户声明的析构函数,则不建议使用这种隐式声明 。

+0

为什么他们不推荐?我的析构函数是虚拟的,但是是空的。我真的被迫强制复制构造一代吗?我想我可以使用'default'? – 2014-03-28 18:14:22

+0

@JanusTroelsen:我在这个答案中有一个基本原理:http://stackoverflow.com/a/11255258/576911是的,你可以使用'= default'。 – 2014-03-28 18:33:53

3

不会。你会得到一个默认的拷贝构造函数,除非你提供你自己的拷贝构造函数,并且析构函数的存在或不存在都没有区别。

1

默认的拷贝构造函数总是被创建的,除非你定义了自己的拷贝构造函数。没有参数的构造函数没有使用任何其他构造函数来定义,以避免调用它,因此跳过了真正的构造函数的代码。

+0

感谢您解释此行为的原因) – Septagram 2011-04-11 10:04:39

3

号并注意

MyClass 
{ 
    template <typename T> MyClass(const T&); 
}; 

不提供拷贝构造函数,并产生一个默认的。

+0

为什么不呢?即使它不仅被宣布,也被定义?即使有专业化(模板<> MyClass :: MyClass (const MyClass&){...})? – Septagram 2011-04-11 10:00:32

+0

@Septagram:nope。专业化不会改变交易,也不会考虑重载解决方案。复制构造函数**必须**是非模板函数,句点。 – 2011-04-11 10:06:03

+0

这很奇怪。但好吧,谢谢:) – Septagram 2011-04-11 10:24:07

9

12.8#4 复制类对象

如果类定义不 显式声明的拷贝构造函数, 一个是隐式声明

和析构函数不演奏部分

+0

报价积分 – Septagram 2011-04-11 10:28:08