c++ - std::list - 迭代器是否在移动时失效?

标签 c++ c++11 c++14

std::list 迭代器有一些非常好的属性——当任何其他元素被移除时,当一个新元素被添加时,甚至当 2 个列表被交换时,它们仍然有效(Iterator invalidation rules)!

考虑到以下代码行为,并且迭代器是通过一种指向实际节点的指针形式实现的,当列表移动时它不会改变,我的猜测是迭代器在新容器中仍然有效时 std::list 已移动,但我也可以通过访问实际上具有“预期”值的无效内存来进入 UB 区域。

std::list<int> l1{3, 2, 1};
std::list<int> l2;

auto it = std::prev(l1.end());
std::cout<<l1.size()<<" "<<l2.size()<<" "<<*it<<std::endl;

l2 = std::move(l1);
std::cout<<l2.size()<<" "<<*it<<std::endl;

3 0 1
3 1

如果 std::list 移动时迭代器仍然有效,是否由标准保证?其他容器呢?

最佳答案

对于一般的容器,只有 swap 保证迭代器保持有效(并指向交换的容器)。

对于 std::list,特殊成员函数 splice() 保证迭代器保留其预期的含义。

一般来说,从右值构造容器并不能保证迭代器;唯一的一般要求是新容器与最初构造它的容器具有“相同的值”。

(您可以想象存储对容器的引用的调试迭代器实现,并且该引用在移动后将变为悬空。)

关于c++ - std::list - 迭代器是否在移动时失效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26378894/

相关文章:

c++ - 为什么标准不允许在模板参数列表中初始化常量依赖类型?

c++ - Bison 值(value) move/效率

c++ - 将参数从一个类传递到另一个类

c++ - 将 LTR 转换为 RTL?

c++ - 如何强制 cv::Mat 表现为智能指针

c++ - 基本案例功能是强制性的还是可以自动合成?

c++ - 从类模块检索信息以在 switch 语句中输出的问题

c++ - LockFileEx 读写升级/降级

c++ - 放置新的和完美的转发

c++ - std::mutex 不能在 std::thread 之间共享