C ++ 0x中的特殊成员函数

维基百科关于特殊成员函数的文章不包含任何移动构造函数和移动赋值运算符的引用。 我想更新条目,但我不确定0x标准是什么。 关于这两个功能的规则是什么?它们是由编译器自动生成的,如果是这样的话? 编辑:我已经更新了维基百科页面,如果有人感觉它,请通过编辑形状(如果需要)帮助社区。     
已邀请:
请记住C ++ 0x还不是很标准,这可能会有所变化。从FCD(PDF链接),移动构造函数和移动赋值运算符确实可以显式默认,甚至隐式默认。***** 我只是引用(严重删节)一堆可能有用的内容: 关于明确默认的函数,§8.4.2/ 1-2:   明确默认的函数应该         是一个特殊的会员功能,   具有相同的声明函数类型,就像它已被隐式声明一样,   没有默认参数,和   没有异常规范。         如果在第一次声明中明确违约,         它应该是公开的,   它不应该是明确的,   它不应该是虚拟的,   它隐含地被认为具有相同的异常规范,就好像它已被隐式声明(15.4),和   对于复制构造函数,移动构造函数,复制赋值运算符或移动赋值运算符,它应具有与隐式声明的相同的参数类型。    关于特殊成员职能,§12/ 1:   默认构造函数(12.1),复制构造函数和复制赋值运算符(12.8),移动构造函数和移动赋值运算符(12.8)以及析构函数(12.4)是特殊成员函数。 [注意:当程序没有明确声明它们时,实现将隐式声明某些类类型的这些成员函数。如果使用它们,实现将隐式定义它们。见12.1,12.4   和12.8。 - 尾注] 关于隐式声明的函数,§12.8/ 8-11:   如果类定义没有显式声明复制构造函数并且没有用户声明的移动构造函数,则复制构造函数被隐式声明为默认值(8.4)。      类X的隐式声明的复制构造函数将具有
X::X(const X&)
形式         X的每个直接或虚拟基类B都有一个复制构造函数,其第一个参数类型为
const B&
const volatile B&
,并且   对于类型为M(或其数组)的X的所有非静态数据成员,每个这样的类类型都有一个复制构造函数,其第一个参数的类型为
const M&
const volatile M&
。         否则,隐式声明的复制构造函数将具有
X::X(X&)
形式。      如果类定义没有显式地声明一个移动构造函数,那么当且仅当如下时,将隐式声明一个默认值         X没有用户声明的复制构造函数和   移动构造函数不会被隐式定义为已删除。         [注意:当未隐式声明或显式提供移动构造函数时,否则将调用移动构造函数的表达式可能会调用复制构造函数。 - 尾注]      类X的隐式声明的移动构造函数将具有
X::X(X&&)
的形式。 在隐式删除的默认函数上,§12.8/ 12:   隐式声明的复制/移动构造函数是其类的内联公共成员。如果X具有以下内容,则将类X的默认复制/移动构造函数定义为已删除(8.4.3):         具有非平凡对应构造函数的变体成员,X是类似联合的类,   类型M(或其数组)的非静态数据成员,由于应用于M的相应构造函数的重载解析(13.3),无法复制/移动,导致模糊或从默认情况下删除或无法访问的函数构造函数,或   直接或虚拟基类B无法复制/移动,因为重载解析(13.3),应用于B的相应构造函数,导致模糊或从默认构造函数中删除或无法访问的函数,或者   对于移动构造函数,一个非静态数据成员或直接或虚拟基类,其类型没有移动构造函数,并且不是简单的可复制。    §12.8/ 13-18定义了函数在隐式生成时应如何工作。 §12.8/ 19然后与§12.8/ 8做同样的事情,除了复制赋值和移动赋值运算符。它们足够相似,不值得在这里引用。 为了获得更完整的图片,您需要完整阅读这些部分,但这是一般性的想法。我很高兴我们得到隐式移动语义。 *但是像默认的复制功能一样,它们可能并不总是具有正确的行为!三巨头应该成为五巨头。 (例如,只要我们需要深层复制某些东西,就会实现三巨头。我们还需要确保我们进行“深度移动”,其中源的数据被清零/重置。这不是隐含的。)     

要回复问题请先登录注册