LINUX.ORG.RU

История изменений

Исправление 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
неважно что вернул нам *it ссылку или сам тип 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
неважно что вернул нам *it ссылку или сам тип value_type

Контракт InputIterator здесь не нарушен.

Но если мы ожидаем на вход именно RandomInterator (или ForwardIterator), то нет гарантии, что *it возвращающий не ссылку будет работать тут корректно.

Поправьте, пожалуйста, если я где-то не прав.