Namespaces
Variants

C++ named requirements: LegacyBidirectionalIterator

From cppreference.net
C++ named requirements

LegacyBidirectionalIterator — это LegacyForwardIterator , который может перемещаться в обоих направлениях (то есть инкрементироваться и декрементироваться).

Если LegacyBidirectionalIterator it происходит из Container , тогда it 's value_type совпадает с контейнерным, поэтому разыменование ( * it ) возвращает value_type контейнера.

Содержание

Требования

Тип It удовлетворяет требованиям LegacyBidirectionalIterator если

И, учитывая

  • a и b , lvalue типа It
  • reference , тип, обозначаемый std:: iterator_traits < It > :: reference

Следующие выражения должны быть корректными и иметь указанные эффекты:

Выражение Возвращаемое значение Эквивалентное выражение Примечания
-- a It& Предусловия:
  • a декрементируем (существует такой b , что a == ++ b )

Постусловия:

  • a является разыменуемым
  • -- ( ++ a ) == a
  • Если -- a == -- b , то a == b
  • a и -- a обозначают один и тот же объект итератора
a -- преобразуемо в const It & It temp = a ;

-- a ;

return temp ;
* a -- reference

Изменяемый LegacyBidirectionalIterator — это LegacyBidirectionalIterator , который дополнительно удовлетворяет требованиям LegacyOutputIterator .

Примечания

Начальный итератор не может быть декрементирован, и поведение не определено, если -- container. begin ( ) вычисляется.

Двунаправленный итератор не обязательно должен быть разыменовываемым, чтобы быть декрементируемым (в частности, конечный итератор не разыменовывается, но может быть декрементирован).

Концепт

Для определения std::iterator_traits определён следующий исключительно демонстрационный концепт.

template < class I >

concept __LegacyBidirectionalIterator =
__LegacyForwardIterator < I > && requires ( I i )
{
{ -- i } - > std:: same_as < I & > ;
{ i -- } - > std:: convertible_to < const I & > ;
{ * i -- } - > std:: same_as < std:: iter_reference_t < I >> ;

} ;

где исключительно демонстрационный концепт __LegacyForwardIterator описан в LegacyForwardIterator .

(начиная с C++20)

Отчеты о дефектах

Следующие отчеты об изменениях поведения, влияющие на дефекты, были применены ретроактивно к ранее опубликованным стандартам C++.

DR Применяется к Поведение в опубликованной версии Корректное поведение
LWG 299
( N3066 )
C++98 возвращаемый тип * a -- должен был быть
преобразуемым к T
изменен возвращаемый
тип на reference [1]
LWG 383 C++98 b должен был быть разыменовываемым после -- a a должен быть разыменовываемым вместо этого
LWG 1212
( N3066 )
C++98 возвращаемый тип * a -- не соответствовал возвращаемому
типу * a ++ требуемому LegacyForwardIterator
изменен возвращаемый
тип на reference
  1. Данная проблема изначально была решена с помощью N2758 (концепты итераторов), который позже был исключен из стандарта C++.

Смотрите также

определяет, что forward_iterator является двунаправленным итератором, поддерживающим движение назад
(концепт)
Библиотека итераторов предоставляет определения для итераторов, характеристик итераторов, адаптеров и служебных функций