Spec-Zone.ru › C++

Именованные требования C++: LegacyBidirectionalIterator

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

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

Требования

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

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

и для

  • 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-- преобразуемый в constIt& It temp = a; --a; return temp;
*a-- reference

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

Примечания

Итератор begin не допускает декремента, и поведение не определено, если вычисляется --container.begin().

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

Концепция

Для определения 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++.

Отчёт об ошибке Применён к Опубликованное поведение Правильное поведение
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++.

См. также

bidirectional_iterator
(C++20)
задаёт требования к forward_iterator как к двунаправленному итератору, поддерживающему перемещение назад
(концепция)
Библиотека итераторов предоставляет определения итераторов, свойств итераторов, адаптеров и вспомогательных функций

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/named_req/BidirectionalIterator

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API