Nach C++ Standard (3.7.3.2/4) mit (nicht nur Dereferenzierung, sondern auch Kopieren, Casting, was auch immer) ein ungültiger Zeiger ist undefiniertes Verhalten (im Zweifel siehe auch this question). Nun ist die typische Code ein STL containter sieht wie folgt zu verfahren:Warum ist der Vergleich mit "end()" Iterator legal?
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 Element hypothetic über das letzte Element des containter. Da es kein Element gibt, ist die Verwendung eines Zeigers durch diesen Iterator ein undefiniertes Verhalten.
Wie funktioniert das != end()
dann? Ich meine, um den Vergleich durchzuführen, muss ein Iterator konstruiert werden, der eine ungültige Adresse umhüllt, und dann muss diese ungültige Adresse in einem Vergleich verwendet werden, der wiederum ein undefiniertes Verhalten ist. Ist solch ein Vergleich legal und warum?
3.7.3.2/4 besagt nicht, dass das Kopieren und Umwandeln eines ungültigen Zeigers UB ist. Ich glaube, dass deine Interpretation zu weit ist. –
@Kirill V. Lyadvinsky: Vielleicht, aber das ist der Kern der verknüpften Frage, wo der Konsens ist, dass Casting und Zuweisung von ungültigen Zeigern UB ist. – sharptooth