std::input_iterator
Определено в заголовке <iterator> | ||
|---|---|---|
template< class I >
concept input_iterator =
std::input_or_output_iterator<I> &&
std::indirectly_readable<I> &&
requires { typename /*ITER_CONCEPT*/<I>; } &&
std::derived_from</*ITER_CONCEPT*/<I>, std::input_iterator_tag>;
| (с C++20) |
Концепция input_iterator является уточнением input_or_output_iterator, добавляя требование, что значения, на которые ссылаются объекты, могут быть прочитаны (через indirectly_readable), а также требование о наличии тега концепции итератора.
Определение концепции итератора
Определение этой концепции задано через шаблон-псевдоним для демонстрации /*ITER_CONCEPT*/.
Для определения /*ITER_CONCEPT*/<I>, пусть ITER_TRAITS<I> обозначает I, если специализация std::iterator_traits<I> сгенерирована из основного шаблона, или std::iterator_traits<I> в противном случае:
- Если
ITER_TRAITS<I>::iterator_conceptдопустимо и задаёт тип, то/*ITER_CONCEPT*/<I>обозначает этот тип. - В противном случае, если
ITER_TRAITS<I>::iterator_categoryдопустимо и задаёт тип, то/*ITER_CONCEPT*/<I>обозначает этот тип. - В противном случае, если
std::iterator_traits<I>сгенерировано из основного шаблона, то/*ITER_CONCEPT*/<I>обозначаетstd::random_access_iterator_tag. - В противном случае,
/*ITER_CONCEPT*/<I>не обозначает тип и приводит к ошибке подстановки.
Примечания
В отличие от требований LegacyInputIterator, концепция input_iterator не требует equality_comparable, поскольку итераторы ввода обычно сравниваются с контрольными точками.
См. также
|
(C++20) | определяет, что объекты типа могут быть инкрементированы и де-референцированы (концепция) |
|
(C++20) | определяет, что input_iterator является итератором с направленным доступом, поддерживая сравнение на равенство и многократный проход (концепция) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/iterator/input_iterator