std::iter_value_t, std::iter_reference_t, std::iter_const_reference_t, std::iter_difference_t, std::iter_rvalue_reference_t, std::iter_common_reference_t

Header: <iterator>

Compute the associated types of an iterator.

# Declarations

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

(since C++20)

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

(since C++20)

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>>;

(since C++23)

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

(since C++20)

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

(since 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>>;

(since C++20)

Helper templates
template< class T >
concept /*dereferenceable*/ = /* see below */;

(exposition only*)

template< std::indirectly_readable T >
using /*indirect-value-t*/ = /* see below */;

(exposition only*)

# Defect reports

DRApplied toBehavior as publishedCorrect behavior
P2609R3C++20std::iter_common_reference_t was defined in termsof std::iter_value_t& which incorrectly handledstd::projected types that project into rvalue reference typesdefined in terms of/indirect-value-t/to handle such cases

# See also