Ответ 1
Это открытая проблема LWG 2321 [акцент мой]
Для сохранения итераторов требуется (обычно) перемещение контейнеров
[...]
[автор: Стефан Т. Лававей]
23.2.1 [container.requirements.general]/10 говорит, что если не указано иное, функция" no swap() делает недействительными любые ссылки, указатели, или итераторы, ссылающиеся на элементы контейнеров, являющиеся местами. [Примечание: Итератор end() не ссылается ни на какой элемент, поэтому он может быть признан недействительным. - end note] ". Однако переместите конструкторы и Операторы присваивания переадресации не получают аналогичной аннулирования гарантии. Гарантии требуют нескольких исключений, поэтому я не считают, что такой язык, как /11" Если не указано иное (либо явно, либо путем определения функции в терминах других функции), вызывая функцию-член контейнера или передавая контейнер как аргумент функции библиотеки не должен аннулировать итераторы или изменение значений объектов в этом контейнере. " применимо.[2014-02-13 Issaquah]
Общее соглашение о намерениях, несколько формулировок nits и дополнительных абзацев, чтобы попасть.
STL для предоставления обновленной формулировки. Переместить в Open.
Предлагаемое разрешение:
[...]
никакой конструктор перемещения [...] контейнера (кроме
array
) делает недействительными любые ссылки, указатели или итераторы, ссылающиеся на элементы исходного контейнера. [Примечание: Итераторend()
не ссылается ни на какой элемент, поэтому он может быть недействительным. - конечная нота]
Итак, это открытая проблема с общим согласием на ее основное решение (указатель не может быть аннулирован путем перемещения). Однако это официально не принято (пока?) Как дефект. Насколько я знаю, все основные реализации не делают недействительными указатели при построении перемещения, и это, как представляется, обычно (неявно) предоставленная гарантия.