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 * > :

/* 条件値型 */ < 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 /* 条件値型 */ { } ;
(1) ( 説明専用* )
template < class T >

requires std:: is_object_v < T >
struct /* 条件付き値型 */ < 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 /* メンバー要素型を持つ */ =

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 は未定義となる。
次に V C から以下のように決定される:
  • C が未定義、または C オブジェクト型 でない場合、 V は未定義となる。
  • それ以外の場合、 V はCV修飾なしの C となる。

注記

value_type は、 indirectly_readable のような間接読み取り可能な型で使用することを意図しています。範囲での使用は意図されていません。

不具合報告

以下の動作変更の欠陥報告書は、以前に公開されたC++規格に対して遡及的に適用されました。

DR 適用対象 公開時の動作 修正後の動作
LWG 3446 C++20 value_type element_type の両方のネスト型を持つ型に対して
特殊化 (5,6) が曖昧であった
特殊化 (8) を追加
LWG 3541 C++20 LWG 3446により value_type element_type が異なる場合に
ハードエラーが発生するようになった
特殊化 (7) を追加

関連項目

型が * 演算子を適用することで間接的に読み取り可能であることを指定する
(コンセプト)
イテレータの関連型を計算する
(エイリアステンプレート)
イテレータのプロパティに対する統一インターフェースを提供する
(クラステンプレート)