具有有状态分配器的std :: vector :: swap()是否应该使所有迭代器无效?

时间:2011-06-12 16:06:06

标签: c++ visual-studio-2010

鉴于分配器a1a2,其中a1!= a2

std::vector s v1(a1)v2(a2)

然后v1.swap(v2)使所有迭代器无效。

这是预期的行为吗?

1 个答案:

答案 0 :(得分:17)

通常,swap永远不会使迭代器失效。但是,当分配器不同时,另一个规则会发挥作用。在这种情况下,行为取决于allocator_traits<a1>::propagate_on_container_swap::valueallocator_traits<a2>::propagate_on_container_swap::value。如果两者都为真,则分配器与数据一起交换,所有迭代器保持有效。如果其中一个为false,则行为未定义,因此允许VC ++ 2010显示特定行为。

来自[container.requirements.general](来自n3290的措辞):

  

分配器替换仅在allocator_traits<allocatortype>::propagate_on_container_copy_assignment::value时通过复制分配,移动分配或交换分配器来执行,   allocator_traits<allocatortype>::propagate_on_container_move_assignment::valueallocator_traits<allocatortype>::propagate_on_container_swap::value在相应容器操作的实现中是正确的。除非被交换的对象具有比较相等或allocator_traits<allocatortype>::propagate_on_container_swap::value为真的分配器,否则调用容器交换函数的行为是未定义的。

  

在交换之前引用一个容器中的元素的每个迭代器应该在交换后引用另一个容器中的相同元素

  

除非另有说明,否则swap()函数将引用要交换的容器元素的任何引用,指针或迭代器无效。

23.3.6.5未指定vector::swap()的替代规则。