[iterator.concept.readable] (original) (raw)

Types that are indirectly readable by applying operator*model the indirectly_­readable concept, including pointers, smart pointers, and iterators.

template concept indirectly-readable-impl = requires(const In in) { typename iter_value_t; typename iter_reference_t; typename iter_rvalue_reference_t; { *in } -> same_as<iter_reference_t>; { ranges::iter_move(in) } -> same_as<iter_rvalue_reference_t>; } && common_reference_with<iter_reference_t&&, iter_value_t&> && common_reference_with<iter_reference_t&&, iter_rvalue_reference_t&&> && common_reference_with<iter_rvalue_reference_t&&, const iter_value_t&>;

template concept indirectly_readable = indirectly-readable-impl<remove_cvref_t>;

Given a value i of type I, I models indirectly_­readableonly if the expression *i is equality-preserving.

[ Note

:

The expression *i is indirectly required to be valid via the exposition-only dereferenceable concept ([iterator.synopsis]).

end note

]