Pau*_*nta 17 c++ move-semantics c++11
假设我有两个向量,我将一个向另一个移动v1 = std::move(v2); v2在此之后还会处于可用状态吗?
Luc*_*ton 24
从n3290,17.6.5.15移出库类型的状态[lib.types.movedfrom]
- 可以从(12.8)移动C++标准库中定义的类型的对象.可以显式指定或隐式生成移动操作.除非另有规定,否则此类移动物体应置于有效但未指定的状态.
由于状态有效,这意味着您可以安全地操作v2(例如,通过分配它,将其恢复到已知状态).但是,由于它未指定,这意味着v2.empty()只要处于此状态,您就不能依赖任何特定值(但调用它不会使程序崩溃).
请注意,移动语义的这个公理("从对象移动到有效但未指定的状态")是所有代码都应该努力的(大多数时候),而不仅仅是标准库组件.很像复制构造函数的语义应该是复制,但不强制执行.
不,它处于未指定的状态.
摘自open-std-org文章 -
.. move()为其目标提供其参数的值,但没有义务保留其源的值.因此,对于向量,可以合理地期望move()将其参数保留为零容量向量,以避免必须复制所有元素.换句话说,移动是一种潜在的破坏性读取.