我能做些什么来移动的对象?
这个标准是否准确地定义了一个对象从一个对象中移出后我能做些什么? 我曾经认为,用移动物体做的所有事情都是破坏它,但这还不够。
例如,采用标准库中定义的函数模板swap
:
template <typename T> void swap(T& a, T& b) { T c = std::move(a); // line 1 a = std::move(b); // line 2: assignment to moved-from object! b = std::move(c); // line 3: assignment to moved-from object! }
显然,必须能够分配移动的对象,否则第2行和第3行将失败。 那么还有什么我可以做从移动的对象? 我到底能在标准中找到这些细节?
(顺便说一下,为什么它是T c = std::move(a);
而不是T c(std::move(a));
在第一行?)
从对象移出的对象以未指定但有效的状态存在。 这表明,尽管对象可能不再有能力,但其所有成员函数仍应该表现出已定义的行为 – 包括operator=
– 及其所有成员处于已定义的状态 – 并且仍然需要销毁。 该标准没有给出具体的定义,因为它对于每个UDT都是唯一的,但是您可能能够找到标准类型的规格。 有些像容器是比较明显的 – 他们只是移动内容,而空容器是一个明确定义的有效状态。 基元不会修改移动的对象。
注意:我相信这是T c = std::move(a)
所以如果移动构造函数(或复制构造函数,如果没有移动提供)是显式的,函数将失败。
17.6.5.15 [lib.types.movedfrom]
在C ++标准库中定义的类型对象可以从(12.8)中移出。 移动操作可以明确指定或隐式生成。 除非另有规定,否则此类移动物体应置于有效但未指定的状态。
当对象处于未指定状态时,可以对没有先决条件的对象执行任何操作。 如果有一个要执行的前提条件的操作,则不能直接执行该操作,因为您不知道该对象的非指定状态是否满足前提条件。
通常没有先决条件的操作示例:
- 毁坏
- 分配
- const观察者,比如
get
,empty
,size
通常具有先决条件的操作示例:
- 提领
- pop_back
此答案现在以视频格式显示在这里: http : //www.youtube.com/watch?v = vLinb2fgkHk&t = 47m10s