Должен ли std :: vector :: swap () с распределителями с сохранением состояния аннулировать все итераторы? - PullRequest
11 голосов
/ 12 июня 2011

С учетом распределителей a1 и a2, где a1! = a2,

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

, затем v1.swap(v2) делает недействительными все итераторы.

Это ожидаемое поведение?

1 Ответ

17 голосов
/ 12 июня 2011

Как правило, 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().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...