Por que a comparação com o iterador "end ()" é legal?

De acordo com o padrão C ++ (3.7.3.2/4)usando (não apenas desreferenciando, mas também copiando, lançando, o que quer que seja) um ponteiro inválido é um comportamento indefinido (em caso de dúvida, consulte tambémessa questão) Agora, o código típico para atravessar um contêiner STL se parece com o seguinte:

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

std::vector::end() é um iterador para o elemento hipotéticoalém o último elemento do contêiner. Não há elemento lá, portanto, usar um ponteiro nesse iterador é um comportamento indefinido.

Agora, como o!= end() trabalhar então? Quero dizer, para fazer a comparação, um iterador precisa ser construído envolvendo um endereço inválido e, em seguida, esse endereço inválido deverá ser usado em uma comparação que, novamente, é um comportamento indefinido. Essa comparação é legal e por quê?

questionAnswers(8)

yourAnswerToTheQuestion