我能用一个移动的物体做什么?

标准是否精确地定义了一旦对象被移动后我可以对它做什么?我曾经认为,对于一个被移动的对象,你所能做的就是销毁它,但这还不够。

例如,使用标准库中定义的函数模板 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!
}

显然,必须有可能赋值给 move-from 对象,否则第2行和第3行将失败。那么我还能做什么呢?我到哪里可以在标准中找到这些细节?

(顺便问一下,为什么第1行是 T c = std::move(a);而不是 T c(std::move(a));?)

22342 次浏览

已移出对象以未指定但有效的状态存在。这表明,虽然对象可能不能再做更多的事情,但是它的所有成员函数仍然应该显示定义的行为 & mash; 包括 operator= & mash; 和它的所有成员在一个定义的状态-它仍然需要销毁。标准没有给出具体的定义,因为它对于每个 UDT 都是唯一的,但是您可以找到标准类型的规范。有些像容器这样的东西相对比较明显,它们只是移动它们的内容,空容器是定义良好的有效状态。原语不修改从移动的对象。

附注: 我相信它是 T c = std::move(a),所以如果 move 构造函数(或者没有提供 move 的复制建构子)是显式的,那么函数就会失败。

17.6.5.15[ lib.typees.move from ]

C++标准程式库所界定类型的物体可从 (12.8)。移动操作可以显式指定,也可以隐式指定 除非另有指明,否则这些移离的物体须 处于有效但未指定的状态。

当对象处于未指定的状态时,可以对没有前提条件的对象执行任何操作。如果希望执行带有前提条件的操作,则不能直接执行该操作,因为不知道对象的未指定状态是否满足前提条件。

一般来说没有先决条件的操作实例:

  • 毁灭
  • 任务
  • 常量观测器,如 getemptysize

一般来说确实具有先决条件的操作实例:

  • 解除参照
  • 跳回去

这个答案现在以视频格式出现在这里: http://www.youtube.com/watch?v=vLinb2fgkHk&t=47m10s