Следующий отчет о дефектах C ++ (исправленный в C ++ 0x) содержит краткое обсуждение значения «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);
Какие итераторы аннулированы v.erase (i1): i1, i2, оба или ни один?
Во всех существующих реализациях, о которых я знаю, статус i1 и i2 одинаков: оба они будут итераторами, указывающими на некоторые элементы вектора (хотя и не на те же элементы, что были раньше).Вы не получите крушения, если будете их использовать.В зависимости от того, что именно вы подразумеваете под «недействительным», вы можете сказать, что ни один из них не был признан недействительным, потому что они все еще указывают на что-то, или вы можете сказать, что оба были недействительными, потому что в обоих случаях элементы, на которые они указывают, были изменены изпод итератором.
Кажется, что спецификация "безопасна" в отношении итератора и ссылки на недействительность.Это говорит о том, что они признаны недействительными, хотя, как вы и Мэтт Остерн оба отметили, есть элемент вектора по тому же адресу.Он просто имеет другое значение.
Так что те из нас, кто следует стандарту, должны программировать так, как будто этот итератор больше не может использоваться, даже если ни одна реализация не сможет сделать что-то, что фактически остановит их работу.за исключением, возможно, итератора отладки, который мог бы сделать дополнительную работу, чтобы сообщить нам, что мы находимся вне дороги.
Фактически, этот отчет о дефектах относится именно к тому случаю, о котором вы говорите.Поскольку стандарт C ++ 03 фактически говорит , по крайней мере, в этом пункте ваш итератор не признан недействительным.Но это считалось ошибкой.