std::indirectly_readable_traits

来自cppreference.com
< cpp‎ | iterator
 
 
迭代器库
迭代器概念
迭代器原语
(C++17 中弃用)
indirectly_readable_traits
(C++20)


算法概念与工具
间接可调用概念
常用算法要求
(C++20)
(C++20)
(C++20)
工具
(C++20)
迭代器适配器
范围访问
(C++11)(C++14)
(C++14)(C++14)  
(C++11)(C++14)
(C++14)(C++14)  
(C++17)(C++20)
(C++17)
(C++17)
 
在标头 <iterator> 定义
template< class I >
struct indirectly_readable_traits {};
(1) (C++20 起)
template< class T >

struct indirectly_readable_traits<T*> :

    /* cond-value-type */<T> {};
(2) (C++20 起)
template< class I >

    requires std::is_array_v<I>
struct indirectly_readable_traits<I>;

{ using value_type = std::remove_cv_t<std::remove_extent_t<I>>; }
(3) (C++20 起)
template< class T >

struct indirectly_readable_traits<const T> :

    indirectly_readable_traits<T> {};
(4) (C++20 起)
template< /* has-member-value-type */ T >

struct indirectly_readable_traits<T> :

    /* cond-value-type */<typename T::value_type> {};
(5) (C++20 起)
template< /* has-member-element-type */ T >

struct indirectly_readable_traits<T> :

    /* cond-value-type */<typename T::element_type> {};
(6) (C++20 起)
template< /* has-member-value-type */ T >

    requires /* has-member-element-type */<T>

struct indirectly_readable_traits<T> {};
(7) (C++20 起)
template< /* has-member-value-type */ T >

    requires /* has-member-element-type */<T> &&
             std::same_as<std::remove_cv_t<typename T::element_type>,
                          std::remove_cv_t<typename T::value_type>>
struct indirectly_readable_traits<T> :

    /* cond-value-type */<typename T::value_type> {};
(8) (C++20 起)
辅助概念
template< class >
struct /* cond-value-type */ {};
(1) (仅用于阐述*)
template< class T >

    requires std::is_object_v<T>
struct /* cond-value-type */ <T>

{ using value_type = std::remove_cv_t<T>; };
(2) (仅用于阐述*)
template< class T >

concept /* has-member-value-type */ =

    requires { typename T::value_type; };
(3) (仅用于阐述*)
template< class T >

concept /* has-member-element-type */ =

    requires { typename T::element_type; };
(4) (仅用于阐述*)

计算模板实参的关联值类型。如果关联值类型存在,那么它会以嵌套类型 value_type 表示,否则不会定义 value_type。程序可对由程序定义的类型特化 indirectly_readable_traits

解释

以上特化可以非正式地描述如下。

给定类型 T,它的关联值类型 V 按以下方式确定:

  • 如果 T 具有 const 限定,那么 V 是无 const 限定的 T 的关联值类型。
  • 否则,如果 T 是数组类型,那么 V 是无 cv 限定的数组元素类型。
  • 否则,首先确定条件值类型 C
  • 如果 T 是指针类型,那么 C 是被指向的类型。
  • 否则,如果 T 具有嵌套类型 value_typeelement_type
  • 如果两个嵌套类型相同(不考虑 cv 限定),那么 Ctypename T::value_type
  • 否则 C 未定义。
  • 否则,如果 T 只有嵌套类型 value_type 而没有 element_type,那么 Ctypename T::value_type
  • 否则,如果 T 只有嵌套类型 element_type 而没有 value_type,那么 Ctypename T::element_type
  • 否则 C 未定义。
然后按以下方式从 C 确定 V
  • 如果 C 未定义,或者 C 不是对象类型,那么 V 未定义。
  • 否则 V 是无 cv 限定的 C

注解

有意将 value_type 对如迭代器的 indirectly_readable 类型使用。并非有意将它对范围使用。

示例

缺陷报告

下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。

缺陷报告 应用于 出版时的行为 正确行为
LWG 3446 C++20 特化 (5,6) 对具有 value_typeelement_type 两个嵌套类型的类型有歧义 添加特化 (8)
LWG 3541 C++20 LWG 3446 对 value_typeelement_type 不同的情况引入了硬错误 添加特化 (7)

参阅

指定类型通过应用运算符 * 可读
(概念)
计算迭代器的关联类型
(别名模板)
为迭代器各项性质提供统一接口
(类模板)