The most popular post on C++ Iterator invalidation rules claims that it's not clear if the past-the-end iterators (i.e., those returned by end()
, cend()
, rend()
, and crend()
) are invalidated according to the same rules as normal iterators, which point to elements in the container. These claims, made for both 2003 and 2011 C++, defer to a post discussing End iterator invalidation rules, where the accepted answer suggests that the 2003 standard is ambiguous on the matter. This conclusion is based on a comment in 23.1/10 (in the context of swap()
) that seems to imply that when the spec does not explicitly mention invalidation of past-the-end iterators, they may be invalidated.
A comment on that post's question (by mike-seymour) suggests that C++11 is unambiguous on this matter, in the case of deque
s. My question is about all containers:
- In C++11, are there any container operations that may invalidate a past-the-end iterator, and where this behavior is ambiguous in the language specification?
Said differently,
- Can I trust the validity of a past-the-end iterator after performing a container operation that does not say it may invalidate the past-the-end iterators?
vector::erase
, for example, "invalidates iterators and references at or after the point of erasure." The end iterator is necessarily "after the point of erasure." – James McNellisvector::reserve()
, 23.3.6.3/5 (I have rev. n3337), "Reallocation invalidates all the...iterators referring to the elements in the sequence," and this list does not include the past-the-end iterators, which by definition do not point to elements in the sequence. Yet, the SGI implementation invalidates all iterators, presumably the past-the-end ones too [sgi.com/tech/stl/Vector.html#5]. More: stackoverflow.com/a/1624961/985943 – nknight