std::indirectly_readable_traits
| ヘッダ <iterator> で定義 |
||
| template< class I > struct indirectly_readable_traits {}; |
(1) | (C++20以降) |
| template< class T > struct indirectly_readable_traits<T*> : |
(2) | (C++20以降) |
| template< class I > requires std::is_array_v<I> |
(3) | (C++20以降) |
| template< class T > struct indirectly_readable_traits<const T> : |
(4) | (C++20以降) |
| template< /* has-member-value-type */ T > struct indirectly_readable_traits<T> : |
(5) | (C++20以降) |
| template< /* has-member-element-type */ T > struct indirectly_readable_traits<T> : |
(6) | (C++20以降) |
| template< /* has-member-value-type */ T > requires /* has-member-element-type */<T> |
(7) | (C++20以降) |
| template< /* has-member-value-type */ T > requires /* has-member-element-type */<T> && |
(8) | (C++20以降) |
| ヘルパークラスとコンセプト |
||
| template< class > struct /* cond-value-type */ {}; |
(1) | (説明用*) |
| template< class T > requires std::is_object_v<T> |
(2) | (説明用*) |
| template< class T > concept /* has-member-value-type */ = |
(3) | (説明用*) |
| template< class T > concept /* has-member-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は未定義です。
- これらの型が同じ(cv修飾を考慮しない)場合、
- それ以外の場合、
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 | 型が持つ場合、特殊化 (5,6) は曖昧でした。value_typeとelement_typeのネストされた型 |
特殊化 (8) を追加しました。 |
| LWG 3541 | C++20 | LWG 3446 は、曖昧なケースに対してハードエラーを導入しました。value_typeとelement_typeが異なること。 |
特殊化 (7) を追加しました。 |
[編集] 関連項目
| (C++20) |
型が演算子 * を適用することで間接的に読み取り可能であることを規定する(コンセプト) |
| (C++20)(C++20)(C++23)(C++20)(C++20)(C++20) |
イテレータの関連型を計算する (エイリアステンプレート) |
| イテレータのプロパティへの統一的なインターフェースを提供する (クラステンプレート) |