明确的移动ctor是否消除了隐式复制ctor?

del*_*ver 4 c++ constructor implicit-declaration c++11

我接受的答案读这里的是:

[a]不会为显式声明移动构造函数移动赋值运算符的类生成复制构造函数和复制赋值运算符

我注意到(g ++ 4.7.2),如果你定义一个移动构造函数,它将与例如一起使用push_back(),而如果你所做的只是= delete复制构造函数,你就不会得到一个隐式移动构造函数 - 你得到一个错误. [...这让我想知道如果你没有明确地做任何事情,实际使用哪一个(移动或复制)...]

然而,本次网上参考不做出关于拷贝构造函数相同的明确承诺不会在定义转移构造函数被隐式定义.

所以我的问题是,标准保证的第一个报价(包括"或")?我宁愿,一些类这就需要一个明确的析构函数,只需移动构造函数和(删除)家移动运营商,完成"五规则",靠的是隐含的复制方法被定义.如果我不能依赖它,那么我将不得不明确=delete它们 - 但这是很多潜在的冗余.

Pie*_*aud 6

所以我的问题是,标准保证的第一个报价(包括"或")?

是的,您的第一个报价由标准保证.

引用标准(草案n3690):

12.8复制和移动类对象[class.copy]

7 /如果类定义没有显式声明复制构造函数,则会隐式声明一个.如果类定义声明了移动构造函数或移动赋值运算符,则隐式声明的复制构造函数被定义为已删除; 否则,它被定义为默认值(8.4).如果类具有用户声明的复制赋值运算符或用户声明的析构函数,则不推荐使用后一种情况.