Namespaces
Variants

std:: indirectly_readable_traits

From cppreference.net
Iterator library
Iterator concepts
Iterator primitives
(deprecated in C++17)
indirectly_readable_traits
(C++20)


Algorithm concepts and utilities
Indirect callable concepts
Common algorithm requirements
(C++20)
(C++20)
(C++20)
Utilities
(C++20)
Iterator adaptors
Range access
(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_type element_type
  • 若这些类型相同(不考虑 cv 限定符),则 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 未定义。
随后根据 C 按以下方式确定 V
  • C 未定义,或 C 不是 对象类型 ,则 V 未定义。
  • 否则, V 为去除 cv 限定符的 C

注释

value_type 旨在用于 indirectly_readable 类型(例如迭代器),不适用于范围类型。

示例

缺陷报告

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

缺陷报告 适用范围 发布时行为 修正后行为
LWG 3446 C++20 对于同时具有
value_type element_type 嵌套类型的特化 (5,6) 存在歧义
增加特化 (8)
LWG 3541 C++20 LWG 3446 对 value_type element_type
类型不同的歧义情况引入了硬错误
增加特化 (7)

参见

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