std::indirectly_readable_traits
来自cppreference.com
                    
                                        
                    
                    
                                                            
                    |   定义于头文件  <iterator>
  | 
||
|   template< class I > struct indirectly_readable_traits { };  | 
(1) | (C++20 起) | 
|   template< class T > struct indirectly_readable_traits<T*>;  | 
(2) | (C++20 起) | 
|   template< class I >   requires std::is_array_v<I>  | 
(3) | (C++20 起) | 
|   template< class T > struct indirectly_readable_traits<const T> :  | 
(4) | (C++20 起) | 
|   template </*has-member-value-type*/ T> struct indirectly_readable_traits<T>;  | 
(5) | (C++20 起) | 
|   template </*has-member-element-type*/ T> struct indirectly_readable_traits<T>;  | 
(6) | (C++20 起) | 
|   template </*has-member-value-type*/ T>   requires /*has-member-element-type*/<T> &&  | 
(7) | (C++20 起) | 
计算类型 I 的关联值类型,若它存在。用户可对程序定义类型特化 indirectly_readable_traits 。
1) 主模板是空 struct 。
4) 对 const 限定类型的特化。
5) 对定义公开可访问成员类型 
value_type 的类型(例如 std::reverse_iterator )的特化。若 T::value_type 是对象类型,则提供等于 std::remove_cv_t<typename T::value_type> 的成员类型 value_type 。否则无成员 value_type 。6) 对定义公开可访问成员类型 
element_type 的类型(例如 std::shared_ptr )的特化。若 T::element_type 是对象类型,则提供等于 std::remove_cv_t<typename T::element_type> 的 value_type 。否则无成员 value_type 。7) 对定义公开可访问成员类型 
value_type 与 element_type 的类型(例如 std::span )的特化。若 T::value_type 与 T::element_type 均为对象类型且在移除顶层 cv 限定符后为同一类型,则提供等于 std::remove_cv_t<typename T::value_type> 的成员类型 value_type 。否则无成员 value_type 。注解
有意将 value_type 对如迭代器的 indirectly_readable 类型使用。并非有意将它对范围使用。
示例
| 本节未完成 原因:暂无示例  | 
缺陷报告
下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。
| DR | 应用于 | 出版时的行为 | 正确行为 | 
|---|---|---|---|
| LWG 3446 | C++20 |  特化对含有 value_type 和 element_type 两个成员类型的类型有歧义
 | 
添加了消歧义特化 | 
参阅
|    (C++20)  | 
  指定类型通过应用运算符 * 可读 (概念)  | 
|    (C++20)(C++20)(C++20)(C++20)(C++20)  | 
  计算迭代器的关联类型  (别名模板)  | 
|   为迭代器各项性质提供统一接口  (类模板)  |