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

Pau*_*nta 17 c++ move-semantics c++11

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

Luc*_*ton 24

从n3290,17.6.5.15移出库类型的状态[lib.types.movedfrom]

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

由于状态有效,这意味着您可以安全地操作v2(例如,通过分配它,将其恢复到已知状态).但是,由于它未指定,这意味着v2.empty()只要处于此状态,您就不能依赖任何特定值(但调用它不会使程序崩溃).

请注意,移动语义的这个公理("从对象移动到有效但未指定的状态")是所有代码都应该努力的(大多数时候),而不仅仅是标准库组件.很像复制构造函数的语义应该是复制,但不强制执行.


Mah*_*esh 7

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

摘自open-std-org文章 -

.. move()为其目标提供其参数的值,但没有义务保留其源的值.因此,对于向量,可以合理地期望move()将其参数保留为零容量向量,以避免必须复制所有元素.换句话说,移动是一种潜在的破坏性读取.

  • 它保留在未指定的_but valid_状态.也就是说,您仍然可以以仅具有对象有效的前提条件的方式使用该对象.例如,您可以在移动的向量上调用vector :: clear()以使其进入已知状态,然后开始将对象插入其中. (9认同)
  • 它__must__是有效的.否则当对象超出范围时会发生什么.很可能它的数据存储区中没有任何东西,但无论它是什么,它都是有效的. (3认同)