Почему сравнение с итератором end () допустимо?

Согласно стандарту C ++ (3.7.3.2/4)с помощью (не только разыменование, но и копирование, приведение, что угодно) недопустимый указатель - неопределенное поведение (в случае сомнения также см.этот вопрос). Теперь типичный код для обхода контейнера STL выглядит следующим образом:

std::vector<int> toTraverse;
//populate the vector
for( std::vector<int>::iterator it = toTraverse.begin(); it != toTraverse.end(); ++it ) {
    //process( *it );
}

std::vector::end() является итератором гипотетического элементаза последний элемент контейнера. Там нет элемента, поэтому использование указателя через этот итератор является неопределенным поведением.

Теперь, как!= end() работать тогда? Я имею в виду, что для выполнения сравнения должен быть создан итератор, заключающий в себе недопустимый адрес, а затем этот недопустимый адрес должен быть использован в сравнении, которое опять-таки является неопределенным поведением. Является ли такое сравнение законным и почему?

Ответы на вопрос(8)

Ваш ответ на вопрос