来自another question(实际上是this one,但前者是更好的参考),除了20.5.5.15,我在标准中找不到合适的参考:
C ++标准库中定义的类型的对象可以从(15.8)中移出。移动操作可以显式指定或隐式生成。除非另有说明,否则将这些移出的对象置于有效但未指定的状态。
对先前包含在目标容器中的元素是否有任何要求,例如G。在任务之前被销毁了?
示例:
std::list<SomeClass> v1({10, 12});
std::list<SomeClass> v2({7});
v1 = std::move(v2);
for(auto sc : v2)
{
std::cout << sc << ' ';
}
尽管GCC根本不输出任何内容(std::vector
和std::list
一样),但会收到10 12
作为合法的输出(提供了适当的operator<<
)(例如,只是交换内容,尤其是不删除先前包含的对象)?
到现在为止,我会说“是”,但是对于要依靠它的把握还不够确定,并且好奇不提出问题...
如果合法,如果元素没有立即被销毁(例如,结果某些资源仍处于打开状态,而开发人员期望它们被关闭),那么对于任何开发人员来说,这都是不可预料的吗?
答案 0 :(得分:1)
在[container.requirements.general]
中,我们看到
a
的所有现有元素都被移动分配或销毁了。 确保:a
应等于rv
在此之前的值 分配。
其中a
是目的地,rv
是右值。可以通过将 1 与源目标的元素交换来实现 ,但是很可能是通过调整大小然后移动来实现的。
__swap
来确保确实发生了移动分配。