在容器上移动分配:以前包含的对象的状态
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
,以确保移动任务确实发生。
相关文章:
- 是否需要删除包含对象的"pair"?
- 如何在h文件中包含.o对象文件
- 指针数据类型变量如何包含对象?
- C++ 矢量不显示包含对象的数据
- 唯一 ptr 将所有权移动到包含对象的方法
- 通过引用返回包含对象的向量
- 仅在删除包含对象的向量时调用自定义»析构函数«
- QML中包含对象的QABSTRACTLISTMODEL的缺点
- std::list::merge() 对于包含对象的列表失败
- 从 std::aligned_union_t 获取指向包含对象的指针
- 通过QLIST迭代并在包含对象上调用函数
- 检查子对象的地址是否在包含对象的边界内是否合法
- std::vector 调用在重新分配时无论如何都包含对象的析构函数?
- C++ 如何获取对包含对象的引用
- 从包含对象指针的列表中删除
- 对于数据成员,如果包含对象已在动态内存中,则动态分配此变量(或不动态分配)之间是否有任何区别
- C++标准库容器相对于所包含对象的线程安全性
- 包含对象的结构的向量
- 包含对象的 C++ 结构
- 正在计算包含对象的此指针