Does the following give defined results in terms of the C++ standard?
std::list<int> myList;
std::list<int>::iterator myIter = myList.begin(); // any issues?
myList.push_back( 123 );
myIter++; // will myIter point to the 123 I pushed?
I can test this out on the compiler I'm using... but I'd like a more definitive answer.
This is a different question from this one about empty vectors because it involves asking about the state of iterators AFTER the container ceases to be empty().
All standard iterator and container types behave the same in this regard:
§23.2.1 [container.requirements.general] p6
begin()
returns an iterator referring to the first element in the container.end()
returns an iterator which is the past-the-end value for the container. If the container is empty, thenbegin() == end()
;
And table 107 in §24.2.3 [input.iterators]
demands that as a precondition for ++it
, it
shall be dereferenceable, which is not the case for past-the-end iterators (i.e., what you get from end()
), as such you're treading into the dreaded domain of undefined behaviour.