Самый популярный пост в С++ Правила аннулирования Iterator утверждают, что он не ясен, если итераторы прошедшего конца (т.е. те, которые возвращаются end()
, cend()
, rend()
и crend()
) недействительны в соответствии с теми же правилами, что и обычные итераторы, которые указывают на элементы в контейнере. Эти претензии, сделанные как для С++, так и для С++, откладывают до публикации обсуждения правил аннулирования конца итератора, где принятый ответ предполагает, что стандарт 2003 года неоднозначен по этому вопросу. Этот вывод основан на комментарии в 23.1/10 (в контексте swap()
), который, по-видимому, подразумевает, что, когда спецификация явно не упоминает о недействительности итераторов прошлого, они могут быть признаны недействительными.
Комментарий к этому вопросу (майк-сеймур) предполагает, что С++ 11 однозначен в этом вопросе, в случае deque
s. Мой вопрос касается всех контейнеров:
- В С++ 11 существуют ли какие-либо операции с контейнерами, которые могут привести к аннулированию итератора прошедшего конца, и где это поведение неоднозначно в спецификации языка?
Говорят иначе,
- Могу ли я доверять действительности прошедшего конца итератора после выполнения операции с контейнером, которая не говорит о том, что это может привести к аннулированию итераторов прошедшего конца?