来自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<<
)(例如,仅通过交换内容即可接收,尤其是以前不删除对象包含)?到现在为止,我会说“是”,但对于要依靠它的把握还不够确定,并且好奇不提出问题...
如果合法,如果元素没有立即销毁,那么对于任何开发人员来说,这是否会是意外的(例如,结果是某些资源仍保持打开状态,而开发人员期望它们会关闭)?
最佳答案
在[container.requirements.general]
中,我们看到
a
的所有现有元素都已被移动分配或销毁。
确保:a
应等于rv
在此之前的值
分配。
其中a
是目的地,而rv
是右值。这可以通过与源目标的元素交换1来实现,但是很可能是通过调整大小然后移动来完成的。
必须通过非专用__swap
来确保确实发生了移动分配。
关于c++ - 在容器上 move 分配:先前包含的对象的状态,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52698679/