Disminuyendo un iterador final

Hoy estuve leyendo sobre cómo para los contenedores que admiten la iteración bidireccional, este código es válido:

Collection c(10, 10);
auto last = --c.end();
*last;

Eso me hizo pensar, ¿se requiere que al enviar un par de iteradores bidireccionales [beg, end) a un algoritmo en el STL que --end define? Si es así, ¿el resultado debe ser desreferible?

es decir

void algo(T beg, T end){
    //...
    auto iter = --end;
    //...
    *iter;
} 

Respuestas a la pregunta(4)

Su respuesta a la pregunta