C++, что является результатом итератора + целое число, когда past-end-iterator?

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

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

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

5 ответов

Решение

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

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

Это неопределенное поведение, стандарт ничего не говорит о результате этого.

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

Так как это правда, что это ведет к неопределенному поведению (см. Другие ответы) после стандарта 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_

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

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

Другие вопросы по тегам