Spec-Zone.ru › C++

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

LegacyInputIterator — это LegacyIterator, который может считывать значение элемента, на который указывает итератор. LegacyInputIterator гарантирует корректность только для алгоритмов однопроходного доступа: после инкрементирования LegacyInputIterator i все копии его предыдущего значения могут стать недействительными.

Требования

Тип Определение
X Тип входного итератора
T Тип значения для X (то есть std::iterator_traits<X>::value_type)
R std::iterator_traits<X>::reference
Значение Определение
i, j Значения типа X или constX
r Значение типа X&
Прочее Определение
m Идентификатор, который, возможно, обозначает член данных или функцию-член


X удовлетворяет требованиям LegacyInputIterator, если выполнены все следующие условия:

  • X удовлетворяет требованиям LegacyIterator.
  • X удовлетворяет требованиям EqualityComparable.
  • Следующие выражения корректно сформированы и имеют указанную семантику:
Выражение Тип Семантика
i != j
тип, удовлетворяющий требованиям BooleanTestable (до C++20)
тип, моделирующий boolean-testable (начиная с C++20)
Предусловие i и j принадлежат области ==.
Действие Эквивалентно !(i == j).
*i R, преобразуемый в T Предусловие i является разыменовываемым.
Действие
  • Выражение (void)*i, *i эквивалентно *i.
  • Если i и j принадлежат области ==, и i == j, то *i эквивалентно *j.
i->m Предусловие i является разыменовываемым.
Действие Эквивалентно (*i).m.
++r X& Предусловие r является разыменовываемым.
Постусловие
  • r является разыменовываемым или r находится за конечной позицией.
  • Для любых копий предыдущего значения r больше не требуется быть разыменовываемыми или принадлежать области ==.
(void)r++ Действие Эквивалентно (void)++r.
*r++ преобразуемый в T Действие Эквивалентно T x = *r; ++r; return x;.

Область равенства

Термин область == используется в обычном математическом смысле для обозначения множества значений, которые можно сравнивать с помощью ==. Это множество может изменяться со временем.

Каждый алгоритм задаёт дополнительные требования к области равенства для используемых им значений итераторов. Эти требования можно вывести из того, как алгоритм использует == и !=.

Примечания

Для входного итератора X, который не является LegacyForwardIterator, std::iterator_traits<X>::reference не обязан быть типом ссылки: разыменование входного итератора может возвращать прокси-объект или само значение типа std::iterator_traits<X>::value_type по значению (как в случае с std::istreambuf_iterator).

Концепция

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

template<class I>
concept __LegacyInputIterator =
__LegacyIterator<I> && std::equality_comparable<I> && requires(I i)
{
    typename std::incrementable_traits<I>::difference_type;
    typename std::indirectly_readable_traits<I>::value_type;
    typename std::common_reference_t<
        std::iter_reference_t<I>&&,
        typename std::indirectly_readable_traits<I>::value_type&>;
    *i++;
    typename std::common_reference_t<
        decltype(*i++)&&,
        typename std::indirectly_readable_traits<I>::value_type&>;
    requires std::signed_integral<
        typename std::incrementable_traits<I>::difference_type>;
};

Концепт __LegacyIterator, используемый только для экспозиции, описан в разделе LegacyIterator.

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

Отчёты об ошибках

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

DR Применяется к Опубликованное поведение Корректное поведение
LWG 98 C++98 возвращаемый тип *i++ должен был быть T он может быть любым типом, преобразуемым в T
LWG 2114
(P2167R3)
C++98 преобразуемость в bool была недостаточно строгим требованием, чтобы
отражать ожидания реализаций
требования усилены

См. также

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

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

Spec-Zone.ru

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