Decrementando um iterador final

Eu estava lendo hoje sobre como para contêineres que suportam iteração bidirecional, este trecho de código é válido:

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

Isso me fez pensar: é necessário que, ao enviar um par de iteradores bidirecionais [beg, end] para um algoritmo no STL que --end seja definido? Em caso afirmativo, o resultado deve ser desreferenciável?

ou seja

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

questionAnswers(4)

yourAnswerToTheQuestion