std::contiguous_iterator
| ヘッダ <iterator> で定義 |
||
| template< class I > concept contiguous_iterator = |
(C++20以降) | |
contiguous_iterator concept は、random_access_iterator を拡張し、要素がメモリ内に連続して格納されていることを保証します。
目次 |
[編集] イテレータコンセプトの決定
このコンセプトの定義は、展示専用のエイリアステンプレート /*ITER_CONCEPT*/ を介して指定されます。
/*ITER_CONCEPT*/<I> を決定するために、特殊化 std::iterator_traits<I> がプライマリテンプレートから生成される場合、またはそれ以外の場合に ITER_TRAITS<I> を I または std::iterator_traits<I> とします。
- ITER_TRAITS<I>::iterator_concept が有効で型名を指定する場合、/*ITER_CONCEPT*/<I> はその型を表します。
- そうでなければ、ITER_TRAITS<I>::iterator_category が有効で型名を指定する場合、/*ITER_CONCEPT*/<I> はその型を表します。
- そうでなければ、std::iterator_traits<I> がプライマリテンプレートから生成される場合、/*ITER_CONCEPT*/<I> は std::random_access_iterator_tag を表します。
- そうでなければ、/*ITER_CONCEPT*/<I> は型を表さず、置換失敗となります。
[edit] セマンティック要件
a と b を dereferenceable なイテレータ、c を非 dereferenceable なイテレータとし、型 I が contiguous_iterator をモデルとするのは、それが包含するすべてのコンセプトがモデル化され、かつ以下の条件がすべて満たされる場合です。ここで、b は a から reachable であり、c は b から reachable であるとします。
- std::to_address(a) == std::addressof(*a).
- std::to_address(b) == std::to_address(a) + std::iter_difference_t<I>(b - a).
- std::to_address(c) == std::to_address(a) + std::iter_difference_t<I>(c - a).
- std::to_address(I{}) は well-defined です。
- ranges::iter_move(a) は、std::move(*a) と同じ型、値カテゴリ、および効果を持ちます。
ranges::iter_swap(a, b)が well-formed であれば、その効果は ranges::swap(*a, *b) と同等です。
[編集] 等価性保持
標準ライブラリのコンセプトのrequires式で宣言された式は、(特に明記されていない限り)等価性保持である必要があります。
[編集] 暗黙の式バリエーション
一部の定数左辺値オペランドに対して非変更的である式を使用するrequires式は、暗黙の式バリエーションも必要とする。
[edit] 注釈
contiguous_iterator は、すべての完全なオブジェクト型へのポインタ型によってモデル化されます。
C++17 で LegacyContiguousIterator 要件を満たすことが要求される標準ライブラリのイテレータ型は、C++20 でも contiguous_iterator をモデル化することが要求されます。
[edit] 不具合報告
以下の動作変更を伴う欠陥報告が、以前に公開されたC++標準に遡って適用されました。
| DR | 適用対象 | 公開された動作 | 正しい動作 |
|---|---|---|---|
| LWG 3607 | C++20 | contiguous_iterator はカスタムranges::iter_move および ranges::iter_swap の動作を持つことができます。 |
禁止された |
| LWG 4170 | C++20 | 値初期化された contiguous_iterator のペアは、空の範囲を表せない場合があります。 |
保証された |
[edit] 関連項目
| (C++20) |
bidirectional_iterator が、定数時間での移動と添字演算をサポートするランダムアクセスイテレータであることを規定する(コンセプト) |