std:: contiguous_iterator
|
ヘッダーで定義
<iterator>
|
||
|
template
<
class
I
>
concept contiguous_iterator
=
|
(C++20以降) | |
contiguous_iterator
コンセプトは、
random_access_iterator
を改良し、示された要素がメモリ上で連続して格納されている保証を提供します。
|
これは、プログラムが contiguous iterator i のデリファレンス、インクリメント、デクリメントによる副作用に依存できないことを意味する。なぜなら、標準ライブラリ関数が std:: to_address ( i ) によって取得されたポインタを操作し、 i を直接操作しない可能性があるためである。 |
(C++26 以降) |
目次 |
イテレータコンセプトの決定
この概念の定義は、説明専用のエイリアステンプレート /*ITER_CONCEPT*/ によって指定されます。
/*ITER_CONCEPT*/ < I > を決定するために、 ITER_TRAITS < I > を以下のように定義する: 特殊化 std:: iterator_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
を示す。
(すなわち、 std:: derived_from < /*ITER_CONCEPT*/ < I > , std:: contiguous_iterator_tag > は false と仮定される。) - それ以外の場合、 /*ITER_CONCEPT*/ < I > は型を示さず、置換失敗となる。
セマンティック要件
a
と
b
を
dereferenceable
なイテレータ、
c
を型
I
の非dereferenceableなイテレータとする。
b
が
a
から
reachable
であり、
c
が
b
からreachableであるとき、型
I
が
contiguous_iterator
をモデル化するのは、それが包含する全てのコンセプトがモデル化されており、以下の条件が全て満たされる場合に限る:
- 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 expressions で宣言される式は、 equality-preserving であることが要求されます(特に明記されている場合を除く)。
暗黙的な式のバリエーション
定数左辺値オペランドに対して非変更式を使用する requires expression は、 暗黙的な式バリエーション も要求します。
注記
contiguous_iterator
は、完全オブジェクト型へのすべてのポインタ型によってモデル化されます。
C++17で
LegacyContiguousIterator
要件を満たすことが要求されていた標準ライブラリのイテレータ型は、C++20では
contiguous_iterator
コンセプトをモデル化することも要求されます。
不具合報告
以下の動作変更の欠陥報告書は、以前に公開されたC++規格に対して遡及的に適用されました。
| DR | 適用対象 | 公開時の動作 | 正しい動作 |
|---|---|---|---|
| LWG 3607 | C++20 |
contiguous_iterator
はカスタムの
ranges::iter_move および ranges::iter_swap の動作を持つ可能性があった |
禁止 |
| LWG 4170 | C++20 |
値初期化された
contiguous_iterator
のペアが
空の範囲を表現できない可能性があった |
保証 |
関連項目
|
(C++20)
|
bidirectional_iterator
がランダムアクセスイテレータであることを指定し、定数時間での前進と添字アクセスをサポートする
(コンセプト) |