Причина ограничений `reverse_iterator`

На страница cppreference reverse_iterator нахожу следующее замечание

std::reverse_iterator does not work with iterators that return a reference to a member object (so-called "stashing iterators"). An example of stashing iterator is std::filesystem::path::iterator.

Это утверждение верно? И если да, то почему?

Для меня ограничение не имеет смысла, поскольку я предполагаю, что обратный итератор в основном меняет местами operator ++ и operator -- (и сохраняет базовый итератор на один).

Обновлено: По-видимому, вопрос можно неправильно понять: Я понимаю, что нам нужна операция декремента один раз для реализации обратного итератора. Спрашивается, почему это не реализовано при создании reverse_iterator. Тогда можно избежать проблемы с хранением итератора. Но очевидно, что это не так, и уменьшение выполняется каждый раз, когда итератор разыменовывается. Почему?

stackoverflow.com/questions/28595084/…
user2100815 14.06.2018 00:17
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
4
1
98
1

Ответы 1

and stores the underlying iterator off by one

Вот в чем причина. При разыменовании необходимо вызвать итератор «не один за другим», и если уничтожение созданного итератора делает недействительной ссылку, полученную из него (как в случае с хранением итераторов), то это назальные демоны.

Хорошо, я вижу недоразумение. Когда я писал stored off-by-one, я имел в виду, что во время построения reverse_iterator базовый итератор нужно декрементировать. Я понимаю, что нам нужно декремент в какой-то момент для реализации обратного итератора, но я думаю, что это можно сделать один раз во время построения. Тогда проблема, о которой вы говорите, будет устранена. Видимо это не так. Так почему же нельзя использовать итератор с декрементом во время построения? Извините, если вопрос был неясным по этому поводу.

Andreas H. 14.06.2018 00:33

@AndreasH. Поскольку полученный итератор не может быть декрементируемым. Рассмотрим rend(), созданный из begin().

T.C. 14.06.2018 00:36

: Значит, вы говорите, что `begin ()` дает не декрементируемый итератор?

Andreas H. 14.06.2018 00:41

@AndreasH. По определению, begin() дает итератор в начало контейнера, нет ничего «перед» этой позицией.

curiousguy 02.07.2018 10:30

Другие вопросы по теме