предположим, что у вас есть итератор произвольного доступа (например, std::vector myVector
)
когда iter + someInt
является итератором конца конца, iter + someInt == myVector.end()
??
или это может быть другое значение, чем myVector.end()
?
предположим, что у вас есть итератор произвольного доступа (например, std::vector myVector
)
когда iter + someInt
является итератором конца конца, iter + someInt == myVector.end()
??
или это может быть другое значение, чем myVector.end()
?
Это неопределенное поведение. Все может случиться. Просто назову несколько вариантов: вообще ничего, программа завершает работу, исключение, сбой.
:)
- person sbi; 10.05.2011
Это неопределенное поведение, стандарт ничего не говорит о результате этого.
Это вызвало бы неопределенное поведение в соответствии со стандартом C++ (2003).
Результат не определен стандартом C++.
Поскольку это правда, что это приводит к неопределенному поведению (см. Другие ответы) после стандарта С++, иногда любопытно, что на самом деле произойдет?
На самом деле, это часто совсем не мистика и довольно ясно, что произойдет, однако это зависит от используемого компилятора и его версии, его стандартной библиотеки и флагов компилятора и вашей ОС. Это также означает, что вы абсолютно не должны зависеть от него (например, следующая версия компилятора может изменить поведение).
По вашему вопросу (вы не должны полагаться на следующее): в текущих компиляторах (компилятор gcc, msvc, intel C++) std::vector обычно имеет (по крайней мере) два члена:
T* _begin_; // pointing to begin of array of vector
T* _end_; // pointing to end(), note that array might be larger due to reserve()
Поэтому обычно вы просто получаете указатель за пределами end: ничего серьезного не происходит. Часто вы можете даже легко разыменовать его (либо потому, что массив больше, чем
_end_-_begin_
или потому что программа может получить доступ к памяти afer. Конечно, содержание может быть мусором).
Если вам действительно интересно, посмотрите Ассемблерный код (с оптимизациями и без).