template <class I>
concept bool Readable() {
return ranges::Movable<I>()
&& ranges::DefaultConstructible<I>()
&& requires(const I& i) {
typename ranges::value_type_t<I>;
typename ranges::reference_t<I>;
typename ranges::rvalue_reference_t<I>;
{ *i } -> ranges::Same<ranges::reference_t<I>>;
{ ranges::iter_move(i) } -> ranges::Same<ranges::rvalue_reference_t<I>>;
}
&& ranges::CommonReference<ranges::reference_t<I>, ranges::value_type_t<I>&>()
&& ranges::CommonReference<ranges::reference_t<I>,
ranges::rvalue_reference_t<I>>()
&& ranges::CommonReference<ranges::rvalue_reference_t<I>,
const ranges::value_type_t<I>&>()
&& ranges::Same<std::common_reference_t<ranges::reference_t<I>,
ranges::value_type_t<I>>,
ranges::value_type_t<I>>()
&& ranges::Same<std::common_reference_t<ranges::rvalue_reference_t<I>,
ranges::value_type_t<I>>,
ranges::value_type_t<I>>();
} |
|
(ranges TS) |