命名空间
变体
操作

std::indirectly_readable_traits

来自 cppreference.cn
 
 
迭代器库
迭代器概念
迭代器原语
(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-qualified,`V` 是 const-unqualified `T` 的关联值类型。
  • 否则,如果 `T` 是数组类型,`V` 是 cv-unqualified 数组元素类型。
  • 否则,首先确定条件值类型 `C`:
  • 如果 `T` 是指针类型,`C` 是所指向的类型。
  • 否则,如果 `T` 具有嵌套类型 `value_type` 和 `element_type`:
  • 如果这些类型相同(不考虑 cv-qualification),`C` 是 `typename T::value_type`。
  • 否则,`C` 未定义。
  • 否则,如果 `T` 具有嵌套类型 `value_type` 但没有 `element_type`,`C` 是 `typename T::value_type`。
  • 否则,如果 `T` 具有嵌套类型 `element_type` 但没有 `value_type`,`C` 是 `typename T::element_type`。
  • 否则,`C` 未定义。
然后 `V` 根据 `C` 确定如下:
  • 如果 `C` 未定义,或者 `C` 不是对象类型,则 `V` 未定义。
  • 否则,`V` 是 cv-unqualified `C`。

[编辑] 注意

`value_type` 旨在与 `indirectly_readable` 类型(如迭代器)一起使用。它不打算与范围一起使用。

[编辑] 示例

[编辑] 缺陷报告

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

缺陷报告 应用于 发布时的行为 正确的行为
LWG 3446 C++20 特化 (5,6) 对于同时具有
`value_type` 和 `element_type` 嵌套类型的类型是模糊的
添加了特化 (8)
LWG 3541 C++20 LWG 3446 引入了歧义情况的硬错误
`value_type` 和 `element_type` 不同
添加了特化 (7)

[编辑] 另请参阅

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