维基百科文章关于特殊成员函数 http://en.wikipedia.org/wiki/Special_member_functions不包含任何对移动构造函数和移动赋值运算符的引用。
我想更新该条目,但我不确定 0x 标准的内容。
这两个函数的规则是什么?它们是由编译器自动生成的吗?如果是的话,什么时候生成?
Edit:我已经更新了维基百科页面,如果有人愿意,请通过编辑它来帮助社区(如果需要)。
请记住,C++0x 还不是很标准,这可能会发生变化。来自FCD http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2010/n3092.pdf(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&)
if
- X 的每个直接或虚拟基类 B 都有一个复制构造函数,其第一个参数的类型为
const B&
or const volatile B&
, and
- 对于 X 中属于类类型 M(或其数组)的所有非静态数据成员,每个此类类类型都有一个复制构造函数,其第一个参数的类型为
const M&
or 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 相同的操作,但复制赋值和移动赋值运算符除外。它们非常相似,无需在此引用。
为了获得更完整的了解,您需要完整阅读这些部分,但这就是总体思路。我很高兴我们获得了隐式移动语义。
*但是就像默认的复制功能一样,它们可能并不总是具有正确的行为!三巨头应该成为五巨头。 (例如,每当我们需要深度复制某些内容时,就会实现“三巨头”。我们还需要确保进行“深度移动”,其中源数据被清空/重置。这是not隐式完成。)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)