Если у вас есть итератор, который фактически является прокси-сервером и содержит данные, которые он возвращает, как вы можете создать обратный итератор?
Реализация stre :: reverse_iterator оператора разыменования создает временный объект, который затем декрементируется и разыменовывается с кодом, который выглядит примерно так:
reference operator*() const {
iterator tmp = current;
return *--tmp;
}
в результате он возвращает вам указатель на данные, которые выходят из области видимости, прежде чем вы получите их.
Это имеет довольно печальные результаты.
Как вы можете обойти это?
Похоже, вам нужно написать собственную реализацию обратного итератора для этого конкретного случая, поскольку ваш тип итератора несовместим с этой конкретной реализацией reverse_iterator.
В соответствии с http://en.cppreference.com/w/cpp/iterator/reverse_iterator, некоторые реализации также хранят уменьшенную копию итератора, но не все. Boost :: reverse_iterator не отображает дополнительную копию.
Я думаю, что реализация стандартной библиотеки неверна. Если вы посмотрите на 24.5.1.3.4 [reverse.iter.op.star] в стандарте C ++ 11, вы найдете следующее:
deref_tmp = current;
--deref_tmp;
return *deref_tmp;
Примечание. Эта операция должна использовать вспомогательную переменную-член, а не временную переменную, чтобы избежать возврата ссылки, которая сохраняется в течение времени жизни ассоциированного итератора.
В стандарте deref_tmp
является членом данных только для экспозиции reverse_iterator
,