В соответствии со стандартом С++ (3.7.3.2/4), использующим (не только разыменование, но и копирование, кастинг, что бы то ни было) неправильный указатель undefined (в случае сомнения также см. этот вопрос). Теперь типичный код для перемещения 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()
является итератором на гипотетическом элементе за последним элементом контейнера. Там нет элемента, поэтому использование указателя через то, что итератором является поведение undefined.
Теперь как работает != end()
? Я хочу сказать, что для сравнения следует, что итератор должен быть сконфигурирован, обертывая недействительный адрес, а затем этот недопустимый адрес должен использоваться для сравнения, которое снова является undefined. Является ли такое сравнение законным и почему?