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

jyo*_*ung 11 c++ visual-studio-2010

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

std::vectors v1(a1)v2(a2)

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

这是预期的行为吗?

Ben*_*igt 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().