# std::experimental::ranges::value_type

< cpp‎ | experimental‎ | ranges

定义于头文件 `<experimental/ranges/iterator>` |  |
template< class I > struct value_type { }; | (1) |
template< class T > struct value_type<T*>; | (2) |
template< class I > requires std::is_array<I>::value struct value_type<I> : value_type<std::decay_t<I>> { }; | (3) |
template< class T > struct value_type<const T> : value_type<std::decay_t<T>> { }; | (4) |
template <class T> requires requires { typename T::value_type; } struct value_type<T>; | (5) |
template <class T> requires requires { typename T::element_type; } struct value_type<T>; | (6) |

计算类型 `I` 的关联值类型，若它存在。用户可对程序定义类型特化 `value_type` 。

1) 初等模板是空 struct 。
2) 对指针的特化。若 `T` 是对象类型，则提供等于 std::remove_cv_t<T> 的成员类型 `type` 。否则，无成员 `type` 。
3) 对数组类型的特化。
4) 对 const 限定类型的特化。
5) 对定义公开且可访问成员类型 `value_type` 的类型的特化。若 `T::value_type` 是对象类型，则提供等于 `T::value_type` 的成员类型 `type` 。否则无成员 `type` 。
6) 对定义公开且可访问成员类型 `element_type` 的类型（例如 std::shared_ptr ）的特化。若 `T::element_type` 是对象类型，则提供等于 std::remove_cv_t<typename T::element_type> 的成员类型 `type` 。否则无成员类型 `type` 。

### 辅助别名模版

template< class T > using value_type_t = typename ranges::value_type<T>::type; |  | (范围 TS)

### 注意

若类型一同含有 `value_type` 成员和 `element_type` 成员，则特化 (5) 和 (6) 有歧义。

`value_type` 被有意用于如迭代器的 `Readable` 。它并非被有意用于范围。

### 示例

| 本节未完成 原因：暂无示例

### 参阅

Readable | 指定类型通过应用运算符 `*` 可读 (概念)
iterator_traits | 汇集迭代器的关联类型的兼容性特性类 (别名模板)