gpt4 book ai didi

c++ - 为什么 STL 使用赋值运算符在容器中移动项目?

转载 作者:搜寻专家 更新时间:2023-10-31 01:05:18 27 4
gpt4 key购买 nike

例如,如果我们有一个包含 10 个元素的 vector ,并且我们决定删除第 5 个元素,则第 5 个之后的所有元素都必须向后移动一个元素。为什么这里使用赋值运算符?为什么不直接复制这些位,因为我们知道旧拷贝即将被覆盖/失效?

显然这改变了我们的移动构造函数。我们假设此处未使用移动构造函数/赋值。

最佳答案

根本原因是C++对象可以保留涉及对象(或其子对象)地址的类不变量

因此,如果要在不同的地址建立对象的值,则该类可能需要执行代码来保持不变量。该代码进入移动/复制构造函数/赋值和交换函数(如果适用)。

这种不变量的一个(可能过于详细)示例是,“恰好有一个子对象注册到某个全局指针集合,但哪个对象在对象之间有所不同”。如果您所做的只是复制位,那么就没有机会根据对象状态用“正确”的子对象更新全局集合。

在 C++03 中有一个严重的限制,在你描述的情况下,有些类适合只复制所有位,但不适合只复制所有位的拷贝一般分配,并且拷贝在您的情况下不必要地昂贵。这种限制正是 C++11 移动语义解决的问题,让类有机会表现得不同。

关于c++ - 为什么 STL 使用赋值运算符在容器中移动项目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22746941/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com