История изменений
Исправление Dudraug, (текущая версия) :
Но это значит что it::value_type и it::reference могут быть одного типа! Они же преобразуемы друг в друга!
Правда cppreference.com говорит что random access iterator -> BidirectionalIterator -> ForwardIterator -> InputIterator -> Iterator
То что вы описали отосится к InputIterator, но уже описания ForwardIterator говорит нам.
The type std::iterator_traits<It>::reference must be exactly
T& if It satisfies OutputIterator (It is mutable)
const T& otherwise (It is constant),
Что значит, что RandomAccessIterator должен возвращать ссылку или константную ссылку
это надстройка над Bidirectional Iterator и он (RAI) не переопределяет поведение
Лично я понимаю это так. Если мы ожидаем на вход нашей функции InputIterator, то нечто возвращаемое по *it вполне удовлетворяет простому условию
*i reference, convertible to value_type
Контракт InputIterator здесь не нарушен.
Но если мы ожидаем на вход именно RandomInterator (или ForwardIterator), то нет гарантии, что *it возвращающий не ссылку будет работать тут корректно.
Поправьте, пожалуйста, если я где-то не прав.
Исходная версия Dudraug, :
Но это значит что it::value_type и it::reference могут быть одного типа! Они же преобразуемы друг в друга!
Правда cppreference.com говорит что random access iterator -> BidirectionalIterator -> ForwardIterator -> InputIterator -> Iterator
То что вы описали отосится к InputIterator, но уже описания ForwardIterator говорит нам.
The type std::iterator_traits<It>::reference must be exactly
T& if It satisfies OutputIterator (It is mutable)
const T& otherwise (It is constant),
Что значит, что RandomAccessIterator должен возвращать ссылку или константную ссылку
это надстройка над Bidirectional Iterator и он (RAI) не переопределяет поведение
Лично я понимаю это так. Если мы ожидаем на вход нашей функции InputIterator, то итератор возвращаемы по *it вполне удоволетворяет простому условию
*i reference, convertible to value_type
Контракт InputIterator здесь не нарушен.
Но если мы ожидаем на вход именно RandomInterator (или ForwardIterator), то нет гарантии, что *it возвращающий не ссылку будет работать тут корректно.
Поправьте, пожалуйста, если я где-то не прав.