c ++, что является результатом итератора + целое число при прошлом итераторе? - PullRequest
5 голосов
/ 10 мая 2011

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

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

или может отличатьсязначение чем myVector.end()?

Ответы [ 5 ]

5 голосов
/ 10 мая 2011

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

2 голосов
/ 10 мая 2011

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

2 голосов
/ 10 мая 2011

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

1 голос
/ 10 мая 2011

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

0 голосов
/ 10 мая 2011

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

_end_-_begin_

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...