std::indirectly_readable
std::indirectly_readable (간접 읽기 가능 컨셉)
operator*와 ranges::iter_move로 반복자가 참조하는 객체에서 읽을 수 있는 타입에 대한 요구사항을 명세하는 컨셉이에요. C++20부터 있어요.
출처: cppreference
본문
<iterator> 헤더에 정의돼 있어요.
// (1) exposition-only 구현 컨셉
template< class In >
concept __IndirectlyReadableImpl =
requires(const In in) {
typename std::iter_value_t<In>;
typename std::iter_reference_t<In>;
typename std::iter_rvalue_reference_t<In>;
{ *in } -> std::same_as<std::iter_reference_t<In>>;
{ ranges::iter_move(in) } -> std::same_as<std::iter_rvalue_reference_t<In>>;
} &&
std::common_reference_with<
std::iter_reference_t<In>&&, std::iter_value_t<In>&
> &&
std::common_reference_with<
std::iter_reference_t<In>&&, std::iter_rvalue_reference_t<In>&&
> &&
std::common_reference_with<
std::iter_rvalue_reference_t<In>&&, const std::iter_value_t<In>&
>;
// (2) 공개 컨셉
template< class In >
concept indirectly_readable = __IndirectlyReadableImpl<remove_cvref_t<In>>;
indirectly_readable<In> 컨셉은 타입 In의 객체 in에 대해 *in과 ranges::iter_move(in)으로 읽을 수 있고, 참조·값·rvalue 참조 타입이 서로 common reference를 갖는 타입을 명세해요. value_type, reference, rvalue_reference 연관 타입이 요구돼요.
예제
#include <iterator>
#include <vector>
#include <concepts>
int main()
{
static_assert(std::indirectly_readable<std::vector<int>::iterator>);
static_assert(std::indirectly_readable<int*>);
}