Spec-Zone.ru › C++

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

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

Требования

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

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

И, при условии

  • i и j, значения типа It или const It
  • r, lvalue типа It
  • reference, тип, обозначаемый std::iterator_traits<It>::reference
  • value_type, тип, обозначаемый std::iterator_traits<It>::value_type

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

Выражение Тип возвращаемого значения Эквивалентное выражение Примечания
i != j контекстуально преобразуется в bool !(i == j) Предварительное условие: (i, j) находится в области определения ==.
*i reference, преобразуемое в value_type Если i == j и (i, j) находятся в области определения ==, то это эквивалентно *j.

Предварительное условие: i разрешается для разыменования.

Выражение (void)*i, *i эквивалентно *i.

i->m (*i).m Предварительное условие: i разрешается для разыменования.
++r It&

Предварительное условие: r разрешается для разыменования.

Последующее условие: r разрешается для разыменования или r указывает на конец последовательности.

Последующее условие: Любые копии предыдущего значения r больше не должны разрешаться для разыменования или находиться в области определения ==.

(void)r++ (void)++r
*r++ преобразуемое в value_type value_type x = *r; ++r; return x;

Примечания

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

Тип reference для входного итератора, который также не является LegacyForwardIterator, не обязательно должен быть типом ссылки: разыменование входного итератора может вернуть объект-прокси или 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++ был value_type он может быть любым типом, преобразуемым в value_type

См. также

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

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

Spec-Zone.ru

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