# std::input_iterator

< cpp‎ | 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> 若特化 std::iterator_traits<I> 从主模板生成则指代 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` ，因为输入迭代器常与哨位比较。

### 参阅

input_or_output_iterator (C++20) | 指定该类型对象可以自增且可以解引用 (概念)