Zmniejszanie iteratora końcowego

Czytałem dziś o tym, jak dla kontenerów obsługujących dwukierunkową iterację ten fragment kodu jest ważny:

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

Co skłoniło mnie do zastanowienia, czy wymagane jest, aby podczas przesyłania pary dwukierunkowych iteratorów [beg, end) do algorytmu w STL zdefiniowano --end? Jeśli tak, to czy wynik powinien być pozbawiony wartości?

to znaczy

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

questionAnswers(4)

yourAnswerToTheQuestion