std::iter_value_t 외 반복자 연관 타입

std::iter_value_t 외 반복자 연관 타입 (Iterator associated types)

반복자의 연관 타입(값·참조·차이·rvalue 참조·공통 참조)을 얻기 위한 타입 별칭들이에요. C++20부터 있어요.

출처: cppreference

본문

<iterator> 헤더에 정의돼 있어요.

// (1) iter_value_t
template< class T >
using iter_value_t = /* see below */;

// (2) iter_reference_t
template< /*dereferenceable*/ T >
using iter_reference_t = decltype(*std::declval<T&>());

// (3) iter_const_reference_t (C++23)
template< std::indirectly_readable T >
using iter_const_reference_t =
    std::common_reference_t<const std::iter_value_t<T>&&,
                            std::iter_reference_t<T>>;

// (4) iter_difference_t
template< class T >
using iter_difference_t = /* see below */;

// (5) iter_rvalue_reference_t (C++20)
template< /*dereferenceable*/ T>
    requires /* see below */
using iter_rvalue_reference_t =
    decltype(ranges::iter_move(std::declval<T&>()));

// (6) iter_common_reference_t (C++20)
template< std::indirectly_readable T >
using iter_common_reference_t =
    std::common_reference_t<std::iter_reference_t<T>,
                            /*indirect-value-t*/<T>>;

헬퍼 템플릿

// (7) /*dereferenceable*/ 컨셉 (exposition only)
template< class T >
concept /*dereferenceable*/ = /* see below */;

정의

  • iter_value_t<T>T의 값 타입. indirectly_readable_traits<T>::value_type으로부터 구해져요.
  • iter_reference_t<T>*std::declval<T&>()의 타입(역참조 참조 타입).
  • iter_difference_t<T>T의 차이 타입. incrementable_traits<T>::difference_type으로부터 구해져요.
  • iter_rvalue_reference_t<T>ranges::iter_move 결과의 타입.

iter_value_t, iter_difference_tstd::indirectly_readable·std::incrementable 컨셉에서 사용돼요.

예제

#include <iterator>
#include <vector>
#include <type_traits>

int main()
{
    using It = std::vector<int>::iterator;
    static_assert(std::same_as<std::iter_value_t<It>, int>);
    static_assert(std::same_as<std::iter_difference_t<It>, std::ptrdiff_t>);
}

더 알아보기 (Learn more)

cppreference