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

C++ 使用有状态分配器的std::vector::swap()是否应该使所有迭代器无效?,c++,visual-studio-2010,C++,Visual Studio 2010,给定的分配器a1和a2,其中a1!=a2 和std::vectorsv1(a1)和v2(a2) 然后v1.swap(v2)使所有迭代器无效 这是预期的行为吗?通常,swap不会使迭代器无效。但是,当分配器不同时,另一条规则也会起作用。在这种情况下,行为取决于allocator\u traits::propagate\u on\u container\u swap::value和allocator\u traits::propagate\u on\u container\u swap::value

给定的分配器
a1
a2
,其中
a1
!=<代码>a2

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

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


这是预期的行为吗?

通常,
swap
不会使迭代器无效。但是,当分配器不同时,另一条规则也会起作用。在这种情况下,行为取决于
allocator\u traits::propagate\u on\u container\u swap::value
allocator\u traits::propagate\u on\u container\u swap::value
。如果两者都为true,则分配器将与数据一起交换,所有迭代器都保持有效。如果其中一个为false,则行为未定义,因此允许VC++2010显示的特定行为

来自
[容器.要求.概述]
(n3290的措辞):

仅当
分配器特性::在容器上传播\u复制\u分配::值
时,才通过复制分配、移动分配或交换分配器来执行分配器替换,
allocator\u traits::propagate\u on\u container\u move\u assignment::value
,或
allocator\u traits::propagate\u on\u container\u swap::value
在相应容器操作的实现中为true。对容器交换函数的调用行为是未定义的,除非被交换的对象具有比较相等的分配器或
allocator\u traits::propagate\u on_container\u swap::value
为true

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

除非另有说明。。。no
swap()
函数使引用被交换容器元素的任何引用、指针或迭代器无效


23.3.6.5没有为
vector::swap()

指定备用规则。我认为这不是Visual Studio特有的。我在VS2010的任何包含文件中都找不到“分配器特征”。因此,我认为VS2010不支持此功能。然而,您的回答告诉我这是在未定义的领域,这回答了我对这个问题的担忧。@jyoung:标准中的定义是“Type:Alloc::propagate_on_container_swap,如果存在这样的类型,否则为false_Type”。因此我想您可以查看分配器类定义。“propagate_on_container_swap”也不在里面。查看vector.swap,我只看到分配程序的代码引用==。@jyoung:从“如果存在这样的类型,否则
false\u type
”这句话来看,我认为在
propagate\u on\u container\u swap::value
不是
true
”的情况下,我们可以确定
swap()的行为如果分配器不相等,
是未定义的。