Warum ist der Vergleich mit dem Iterator "end ()" zulässig?

Nach C ++ Standard (3.7.3.2/4) using (nicht nur Dereferenzieren, sondern auch Kopieren, Casting usw.) Ein ungültiger Zeiger ist undefiniertes Verhalten (im Zweifelsfall siehe auchdiese Frag). Der typische Code zum Durchlaufen eines AWL-Containers sieht nun folgendermaßen aus:

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

std::vector::end() ist ein Iterator auf das hypothetische Elementdarüber hinau das letzte Element des Containers. Da dort kein Element vorhanden ist, ist die Verwendung eines Zeigers durch diesen Iterator ein undefiniertes Verhalten.

Now wie funktioniert das!= end() Arbeit dann? Ich meine, um den Vergleich durchzuführen, muss ein Iterator konstruiert werden, der eine ungültige Adresse umschließt, und dann muss diese ungültige Adresse in einem Vergleich verwendet werden, der wiederum ein undefiniertes Verhalten darstellt. Ist ein solcher Vergleich legal und warum?

Antworten auf die Frage(16)

Ihre Antwort auf die Frage