Поскольку это правда, что это ведет к неопределенному поведению (см. Другие ответы) после стандарта 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_
, либо потому, что программа может получить доступ к памяти. Конечно, содержимое может быть мусором).
Если вам действительно интересно, посмотрите код ассемблера (с оптимизацией и без).