Spec-Zone.ru › C++

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

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

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

Требования

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

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

И, учитывая

  • a и b, lvalues типа 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++.

См. также

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

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

Spec-Zone.ru

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