¿Por qué es legal comparar con el iterador "end ()"?

Según el estándar C ++ (3.7.3.2/4)utilizando (no solo desreferenciar, sino también copiar, emitir, lo que sea) un puntero no válido es un comportamiento indefinido (en caso de duda, consulte tambiénesta pregunta) Ahora el código típico para atravesar un contactor STL se ve así:

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

std::vector::end() es un iterador sobre el elemento hipotéticomás allá El último elemento del contactor. No hay ningún elemento allí, por lo tanto, usar un puntero a través de ese iterador es un comportamiento indefinido.

¿Cómo funciona el!= end() trabajo entonces? Quiero decir, para hacer la comparación, se debe construir un iterador envolviendo una dirección no válida y luego esa dirección no válida tendrá que usarse en una comparación que nuevamente es un comportamiento indefinido. ¿Es legal esta comparación y por qué?

Respuestas a la pregunta(8)

Su respuesta a la pregunta