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에 대해 *inranges::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*>);
}

더 알아보기 (Learn more)

cppreference