Как правило, swap
никогда не делает недействительными итераторы.Тем не менее, другое правило вступает в игру, когда распределители отличаются.В этом случае поведение зависит от allocator_traits<a1>::propagate_on_container_swap::value
и allocator_traits<a2>::propagate_on_container_swap::value
.Если оба имеют значение true, распределители обмениваются вместе с данными, все итераторы остаются действительными.Если любое из них имеет значение 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
имеет значение true.
и
Каждый итераторссылка на элемент в одном контейнере до свопа должна ссылаться на тот же элемент в другом контейнере после свопа
и
Если не указано иное ... нет *Функция 1026 * делает недействительными любые ссылки, указатели или итераторы, относящиеся к элементам заменяемых контейнеров.
23.3.6.5 не определяет альтернативные правила для vector::swap()
.