The following C ++ defect report (fixed in C ++ 0x) provides a brief description of the value "invalidate":
http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#414
int A[8] = { 1,3,5,7,9,8,4,2 }; std::vector<int> v(A, A+8); std::vector<int>::iterator i1 = v.begin() + 3; std::vector<int>::iterator i2 = v.begin() + 4; v.erase(i1);
Which iterators are v.erase (i1) invalid: i1, i2, both or none?
In all existing implementations that I know, the status of i1 and i2 is the same: both of them will be iterators pointing to some elements of the vector (although not the same elements that they did before). You will not get collapsed if you use them. depending on what you mean by "invalidate", you can say that none were invalidated because they still point to something, or you can say that both were invalid because in both cases the elements they point to have been modified from under an iterator.
The specification seems to be "playing safe" with respect to the iterator and invalid link. It says that they are invalidated, although, as you and Matt Austern noted, there is still a vector element at the same address. It has a different meaning.
So, those of us that follow the standard should be programmed as if this iterator cannot be used anymore, even if no implementation can do anything that would actually stop their work, with the possible exception of a debug iterator, which could do extra work to tell us that we are SUVs.
In fact, this defect report refers specifically to the case you are talking about. As far as the C ++ 03 standard actually says, at least in this section, your iterator is not invalid. But this was considered a mistake.