C++, что является результатом итератора + целое число, когда past-end-iterator?
Предположим, у вас есть итератор произвольного доступа (например, std::vector myVector
)
когда iter + someInt
является последним итератором,iter + someInt == myVector.end()
??
или это может быть другое значение, чем myVector.end()
?
5 ответов
Это неопределенное поведение. Все может случиться. Просто чтобы назвать несколько вариантов: вообще ничего, выход из программы, исключение, сбой.
Это вызвало бы неопределенное поведение в соответствии со стандартом C++ (2003).
Это неопределенное поведение, стандарт ничего не говорит о результате этого.
Так как это правда, что это ведет к неопределенному поведению (см. Другие ответы) после стандарта C++, иногда это просто currios, что на самом деле произойдет?
На самом деле, это часто вовсе не мистично и довольно ясно, что произойдет, однако это зависит от используемого компилятора и его версии, а также от его стандартных библиотек и флагов компилятора и вашей ОС. Это также означает, что вы абсолютно не должны зависеть от этого (например, следующая версия компилятора может изменить поведение).
На ваш вопрос (Вы не должны полагаться на следующее): В современных компиляторах (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_-_begin_
или потому что программа может получить доступ к памяти. Конечно, содержание может быть мусором).
Если вам действительно интересно, посмотрите код ассемблера (с оптимизацией и без).