[iterator.concept.input]

# 24 Iterators library [[iterators]](./#iterators)

## 24.3 Iterator requirements [[iterator.requirements]](iterator.requirements#iterator.concept.input)

### 24.3.4 Iterator concepts [[iterator.concepts]](iterator.concepts#iterator.concept.input)

#### 24.3.4.9 Concept input_iterator [iterator.concept.input]

[1](#1)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/iterators.tex#L1755)

The [input_iterator](#concept:input_iterator "24.3.4.9 Concept input_­iterator [iterator.concept.input]") concept defines requirements for a type
whose referenced values can be read (from the requirement for[indirectly_readable](iterator.concept.readable#concept:indirectly_readable "24.3.4.2 Concept indirectly_­readable [iterator.concept.readable]") ([[iterator.concept.readable]](iterator.concept.readable "24.3.4.2 Concept indirectly_­readable")))
and which can be both pre- and post-incremented[.](#1.sentence-1)

[*Note [1](#note-1)*:

Unlike the *Cpp17InputIterator* requirements ([[input.iterators]](input.iterators "24.3.5.3 Input iterators")),
the [input_iterator](#concept:input_iterator "24.3.4.9 Concept input_­iterator [iterator.concept.input]") concept does not need
equality comparison since iterators are typically compared to sentinels[.](#1.sentence-2)

â *end note*]

template<class I>concept [input_iterator](#concept:input_iterator "24.3.4.9 Concept input_­iterator [iterator.concept.input]") =[input_or_output_iterator](iterator.concept.iterator#concept:input_or_output_iterator "24.3.4.6 Concept input_­or_­output_­iterator [iterator.concept.iterator]")<I> &&[indirectly_readable](iterator.concept.readable#concept:indirectly_readable "24.3.4.2 Concept indirectly_­readable [iterator.concept.readable]")<I> &&requires { typename *ITER_CONCEPT*(I); } &&[derived_from](concept.derived#concept:derived_from "18.4.3 Concept derived_­from [concept.derived]")<*ITER_CONCEPT*(I), input_iterator_tag>;
