С++ какой результат итератора + целое число, когда прошлое-итератор?

предположим, что у вас есть итератор с произвольным доступом (например, std::vector myVector)

когда iter + someInt является обратным итератором, iter + someInt == myVector.end()??

или может быть другое значение, чем myVector.end()?

Ответы

Ответ 1

Это Undefined Поведение. Все может случиться. Просто для того, чтобы назвать несколько параметров: ничего не происходит, выходы программы, исключение, сбой.

Ответ 2

Это поведение undefined, в стандарте ничего не говорится об итогах этого.

Ответ 3

Это вызовет поведение undefined в соответствии со стандартом С++ (2003).

Ответ 4

Результат undefined по стандарту С++.

Ответ 5

Как это верно, это приводит к поведению undefined (см. другие ответы) после стандарта С++, иногда это currios, что на самом деле произойдет?

На самом деле, это часто не является мистическим вообще и довольно ясно, что произойдет, однако оно зависит от используемого компилятора и его версии, а также от ее стандартных библиотек и флагов компилятора и вашей ОС. Это также означает, что вы абсолютно не должны зависеть от него (например, следующая версия компилятора может изменить поведение).

По вашему вопросу (вы не должны полагаться на следующее): В текущих компиляторах (gcc, msvc, intel С++ компилятор) a 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_

или потому, что программа памяти может получить доступ к памяти. Конечно, содержимое может быть мусором).

Если вам действительно интересно, посмотрите на код ассемблера (с оптимизациями и без).