命名空间
变体
操作

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 用于 间接可读 类型(例如迭代器)。它不适用于范围。

[编辑] 示例

[编辑] 错误报告

以下行为变更缺陷报告已追溯应用于先前发布的 C++ 标准。

DR 应用于 发布的行为 正确行为
LWG 3446 C++20 特化 (5,6) 对具有
value_typeelement_type 嵌套类型
添加特化 (8)
LWG 3541 C++20 LWG 3446 为模糊情况引入了硬错误
value_typeelement_type 不同
添加特化 (7)

[编辑] 另请参阅

指定通过应用操作符 * 使类型间接可读。
(概念) [编辑]
计算迭代器的关联类型
(别名模板)[编辑]
提供对迭代器属性的统一接口
(类模板) [编辑]