std::iter_value_t, std::iter_reference_t, std::iter_const_reference_t, std::iter_difference_t, std::iter_rvalue_reference_t, std::iter_common_reference_t
From cppreference.com
| ヘッダ <iterator> で定義 |
||
| template< class T > using iter_value_t = /* 以下参照 */; |
(1) | (C++20以降) |
| template< /* dereferenceable */ T > using iter_reference_t = decltype(*std::declval<T&>()); |
(2) | (C++20以降) |
| template< std::indirectly_readable T > using iter_const_reference_t = |
(3) | (C++23から) |
| template< class T > using iter_difference_t = /* 以下参照 */; |
(4) | (C++20以降) |
| template< /* dereferenceable */ T> requires /* 以下を参照 */ |
(5) | (C++20以降) |
| template< std::indirectly_readable T > using iter_common_reference_t = |
(6) | (C++20以降) |
| ヘルパーテンプレート |
||
template< class T > concept /* dereferenceable */ = /* 以下参照 */; |
(7) | (説明用*) |
template< std::indirectly_readable T > using /* indirect-value-t */ = /* 以下参照 */; |
(8) | (説明用*) |
イテレータの関連型を計算します。
1)
T の値型を計算します。- もし std::iterator_traits<std::remove_cvref_t<T>> が特殊化されていない場合、std::iter_value_t<T> は std::indirectly_readable_traits<std::remove_cvref_t<T>>::value_type です。
- それ以外の場合は、 std::iterator_traits<std::remove_cvref_t<T>>::value_type です。
2)
T の参照型を計算します。3)
T のconst参照型を計算します。4)
T の差分型を計算します。- もし std::iterator_traits<std::remove_cvref_t<T>> が特殊化されていない場合、std::iter_difference_t<T> は std::incrementable_traits<std::remove_cvref_t<T>>::difference_type です。
- それ以外の場合は、 std::iterator_traits<std::remove_cvref_t<T>>::difference_type です。
5)
T の右辺値参照型を計算します。このエイリアステンプレートの制約は、式 ranges::iter_move(std::declval<T&>()) が有効であり、参照可能な型を持つ場合にのみ満たされます。6)
T の共通参照型を計算します。これは、その参照型と値型の左辺値参照との共通参照型です。8) 公開用のエイリアステンプレート
indirect-value-tは、以下を示します。- std::invoke_result_t<Proj&, /* indirect-value-t */<I>>、もし
Tが、ある型IとProjに関して std::projected<I, Proj> と等しい場合。 - それ以外の場合は、 std::iter_value_t<T>&。
[編集] 不具合報告
以下の動作変更を伴う欠陥報告が、以前に公開されたC++標準に遡って適用されました。
| DR | 適用対象 | 公開された動作 | 正しい動作 |
|---|---|---|---|
| P2609R3 | C++20 | std::iter_common_reference_t は、std::iter_value_t<T>& の用語で定義されていましたが、これは std::projected 型が右辺値参照型に射影する場合に、不適切に処理していました。 |
用語で定義された /* indirect-value-t */<T> これらのケースを処理するために |
[編集] 関連項目
| (C++20) |
型が演算子 * を適用することで間接的に読み取り可能であることを規定する(コンセプト) |
| (C++20) |
semiregular 型が前置および後置インクリメント演算子でインクリメントできることを規定する(コンセプト) |
| (C++20) |
indirectly_readable 型の値型を計算する(クラステンプレート) |
| (C++20) |
weakly_incrementable 型の差分型を計算する(クラステンプレート) |
| イテレータのプロパティへの統一的なインターフェースを提供する (クラステンプレート) | |
| (C++20)(C++23)(C++20)(C++23) |
rangeのイテレータ型と番兵型を取得する (エイリアステンプレート) |
| rangeの参照型を取得する (エイリアステンプレート) | |
| (C++20)(C++20)(C++20) |
rangeのサイズ型、差分型、値型を取得する (エイリアステンプレート) |