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

< cpp‎ | iterator

定义于头文件 `<iterator>` |  |
template< class T > concept __Referenceable = /* see below */; // 仅用于阐释 |  |
template< class T > using iter_value_t = /* see below */; | (1) | (C++20 起)
template< __Referenceable T > using iter_reference_t = decltype(*std::declval<T&>()); | (2) | (C++20 起)
template< class T > using iter_difference_t = /* see below */; | (3) | (C++20 起)
template< __Referenceable T> requires /* see below */ using iter_rvalue_reference_t = decltype(std::iter_move(std::declval<T&>())); | (4) | (C++20 起)
template< std::indirectly_readable T > using iter_common_reference_t = std::common_reference_t<std::iter_reference_t<T>, std::iter_value_t<T>&>; | (5) | (C++20 起)

计算迭代器的关联类型。仅用于阐释的概念 `__Referenceable` 若且唯若表达式 `*std::declval<T&>()` 合法且拥有可引用类型（特别是非 void ）才得到满足。

1) 计算 `T` 的值类型。若 std::iterator_traits<std::remove_cvref_t<T>> 未被特化，则 std::iter_value_t<T> 为 std::indirectly_readable_traits<std::remove_cvref_t<T>>::value_type 。否则它是 std::iterator_traits<std::remove_cvref_t<T>>::value_type 。
2) 计算 `T` 的引用类型。
3) 计算 `T` 的差类型。若 std::iterator_traits<std::remove_cvref_t<T>> 未被特化，则 std::iter_difference_t<T> 为 std::incrementable_traits<std::remove_cvref_t<T>>::difference_type 。否则它是 std::iterator_traits<std::remove_cvref_t<T>>::difference_type 。
4) 计算 `T` 的右值引用类型。此别名模版上的制约的 "see below" 部分若且唯若表达式 ranges::iter_move(std::declval<T&>()) 合法且拥有可引用类型（特别是非 void ）才得到满足。
5) 计算 `T` 的共用引用类型。此乃其引用类型与到其值类型的左值引用类型的共用引用类型。

### 参阅

indirectly_readable (C++20) | 指定类型通过应用运算符 `*` 可读 (概念)
weakly_incrementable (C++20) | 指定 `semiregular` 类型能以前后自增运算符自增 (概念)
indirectly_readable_traits (C++20) | 计算 `indirectly_readable` 类型的值类型 (类模板)
incrementable_traits (C++20) | 计算 `weakly_incrementable` 类型的差类型 (类模板)
iterator_traits | 为迭代器各项性质提供统一接口 (类模板)