25
Iterators library
[iterators]
25.3
Iterator requirements
[iterator.requirements]
25.3.4
Iterator concepts
[iterator.concepts]
25.3.4.2
Concept
indirectly_
readable
[iterator.concept.readable]
1
#
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
=
//
exposition only
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
>
>
;
2
#
Given a value
i
of type
I
,
I
models
indirectly_
readable
only if the expression
*
i
is equality-preserving
.