В качестве детали реализации, vector<int>::iterator
может легко быть int*
.Я думаю, что в g++
это очень тонкая оболочка вокруг int*
.Если это так, то удаление среднего элемента трехэлементного вектора означает, что элемент данных указателя it
остается указанным по тому же адресу, что и удаленный элемент, который, конечно, будет содержать значение, которое ранее было прямым послеэто, и которое также справедливо упоминается it2
.
Стандарт не гарантирует, что it
все еще будет ссылаться на что-либо, поэтому вы не можете полагаться на поведение, которое вы наблюдалиВот.Но это объясняет, что вы видели.Реализация в значительной степени должна делать все возможное, чтобы что-то еще происходило, когда вы разыменовываете it
.Но компиляторы каждый день стараются изо всех сил: например, отладка версий библиотек, а некоторые методы оптимизации основаны на предположениях о том, что ваш код верен.