2010-07-19 64 views
3

维基百科有关special member functions的文章不包含任何有关移动构造函数和移动赋值运算符的引用。C++中的特殊成员函数0x

我想更新条目,但我不确定0x标准说什么。

关于这两个功能的规则是什么?它们是否由编译器自动生成,如果是的话?


编辑:我已经更新的维基百科页面,如果有人感觉就像是请编辑成形状(如果需要),帮助社区。

+0

您应该尝试查找最新版本的草稿。 AFAIK,它们不会自动生成,但(希望)可以请求默认版本('X(X &&)= default;') – visitor 2010-07-19 11:56:03

回答

3

牢记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 A拖欠禁止复制/移动的构造被定义为删除(8.4.3)如果X具有:

  • 与非平凡的相应的构造的变型构件和X是联合状类,
  • 类型为M(或其数组)的非静态数据成员无法复制/移动,因为应用于M的相应构造函数的重载解析(13.3)会导致模糊或函数被删除或无法访问默认的构造函数或者由于应用于B的相应构造函数的重载解析(13.3)而不能复制/移动的直接或虚拟基类B导致歧义或函数从默认构造函数中删除或无法访问,或者对于移动构造函数,非静态数据成员或直接或虚拟基类具有不具有移动构造函数并且不可平分复制的类型的

§12.8/ 13-18定义了函数在隐式生成时应如何工作。

§12.8/ 19然后做与§12.8/ 8相同的事情,除了复制分配和移动赋值操作符。它们足够相似,不需要在这里引用。

要获得更完整的图片,您需要完整阅读这些部分,但这是一般想法。我很高兴我们得到隐式移动语义。


*但是像默认的复制功能,它们可能并不总是有正确的行为!三巨头应该成为大五。 (例如,当我们需要深度复制某些东西的时候,三巨头就会实现,我们还需要确保我们做了一个“深度移动”,其中源数据是空值/重置的,这是而不是隐式完成的。 )