jyo*_*ung 11 c++ visual-studio-2010
鉴于分配器a1和a2,其中a1!= a2,
和std::vectors v1(a1)和v2(a2)
然后v1.swap(v2)使所有迭代器无效.
这是预期的行为吗?
Ben*_*igt 17
通常,swap永远不会使迭代器失效.但是,当分配器不同时,另一个规则会发挥作用.在这种情况下,行为取决于allocator_traits<a1>::propagate_on_container_swap::value和allocator_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::value或allocator_traits<allocatortype>::propagate_on_container_swap::value相应的容器操作的实现中是真实的.除非被交换的对象具有比较相等或allocator_traits<allocatortype>::propagate_on_container_swap::value为真的分配器,否则调用容器的交换函数的行为是未定义的.
和
在交换之前引用一个容器中的元素的每个迭代器应该在交换之后引用另一个容器中的相同元素
和
除非另行指定,否则任何
swap()函数都会使引用被交换容器元素的引用,指针或迭代器无效.
23.3.6.5没有规定备用规则vector::swap().