23 Iterators library [iterators]

23.3 Iterator requirements [iterator.requirements]

23.3.4 Iterator concepts [iterator.concepts]

23.3.4.2 Concept indirectly_­readable [iterator.concept.readable]

Types that are indirectly readable by applying operator* model the indirectly_­readable concept, including pointers, smart pointers, and iterators.
template<class In> concept indirectly-readable-impl = requires(const In in) { typename iter_value_t<In>; typename iter_reference_t<In>; typename iter_rvalue_reference_t<In>; { *in } -> same_­as<iter_reference_t<In>>; { ranges::iter_move(in) } -> same_­as<iter_rvalue_reference_t<In>>; } && common_­reference_­with<iter_reference_t<In>&&, iter_value_t<In>&> && common_­reference_­with<iter_reference_t<In>&&, iter_rvalue_reference_t<In>&&> && common_­reference_­with<iter_rvalue_reference_t<In>&&, const iter_value_t<In>&>;
template<class In> concept indirectly_­readable = indirectly-readable-impl<remove_cvref_t<In>>;
Given a value i of type I, I models indirectly_­readable only if the expression *i is equality-preserving.
[Note 1:
The expression *i is indirectly required to be valid via the exposition-only dereferenceable concept ([iterator.synopsis]).
— end note]