【发布时间】:2014-10-15 09:21:07
【问题描述】:
std::list 迭代器有一些非常好的属性——它们在任何其他元素被删除、添加新元素甚至交换 2 个列表时仍然有效 (Iterator invalidation rules)!
考虑到以下代码行为,并且迭代器是通过指向实际节点的指针形式实现的,该指针在移动列表时不会改变,我的猜测是当@987654323 时迭代器在新容器中仍然有效@ 被移动了,但我也可以通过访问实际上具有“预期”值的无效内存进入 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 时迭代器仍然有效,标准是否保证?其他容器呢?
【问题讨论】:
-
我以前见过类似的问题。 C++11 明确保证
swap不会失效,但不保证移动。不过,它们通常具有相同的效果。 -
我会说它们可能会因不同的分配器而失效。