移动是否使对象处于可用状态?

说我有两个向量,我移动到另一个, v1 = std::move(v2) ; v2还会在这之后处于可用状态吗?

从n3290,17.6.5.15库types的移动状态[lib.types.movedfrom]

  1. 在C ++标准库中定义的types对象可以从(12.8)中移出。 移动操作可以明确指定或隐式生成。 除非另有规定,否则此类移动物体应置于有效但未指定的状态。

由于状态是有效的,这意味着您可以安全地在v2运行(例如通过分配给它,这会使其回到已知状态)。 因为它没有被指定,所以这意味着只要它处于这个状态(但是调用它不会使程序崩溃),就不能为v2.empty()任何特定值使用。

请注意,移动语义的这个公理(“从对象中移出是保留在一个有效但未指定的状态”)是所有代码应该努力(大部分时间)的事情,而不仅仅是标准库组件。 就像复制构造函数的语义应该做一个副本,但不强制执行。

不,它处于未指定的状态。

摘录自open-std-org文章 –

move()给它的目标价值的论点,但没有义务保存其来源的价值 。 因此,对于一个向量,move()可以合理地被期望作为零容量向量离开它的参数,以避免复制所有的元素。 换句话说,移动是一个潜在的破坏性阅读。