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

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

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

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


person eugene    schedule 10.05.2011    source источник
comment
Новый вопрос, наконец, получил ответ, который, в отличие от всех здесь, цитирует Стандарт: Действителен ли зажим итераторов   -  person underscore_d    schedule 03.07.2020


Ответы (5)


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

person MSalters    schedule 10.05.2011
comment
Мишель, у тебя недостаточно воображения! Вот еще несколько вариантов: удалить равно "удалить"> stackoverflow.com/questions/1553382/. :) - person sbi; 10.05.2011

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

person Xeo    schedule 10.05.2011

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

person Nawaz    schedule 10.05.2011
comment
Какой раздел/абзац? - person underscore_d; 03.07.2020

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

person Community    schedule 10.05.2011

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

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

По вашему вопросу (вы не должны полагаться на следующее): в текущих компиляторах (компилятор 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. Конечно, содержание может быть мусором).

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

person eci    schedule 10.05.2011