[英]Move assignment on containers: state of previously contained objects
来自另一个问题 (实际上是这个 问题 ,但是前一个是更好的参考),除了20.5.5.15,我在标准中找不到合适的参考:
C ++标准库中定义的类型的对象可以从(15.8)中移出。 移动操作可以显式指定或隐式生成。 除非另有说明,否则此类移出的对象应置于有效但未指定的状态。
是否对先前包含在目标容器中的元素有任何要求,例如在分配之前被销毁?
例:
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
来确保确实发生了移动分配。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.