C++ named requirements: LegacyForwardIterator
LegacyForwardIterator は、指し示す要素からデータを読み取ることができる LegacyIterator です。
LegacyInputIterator や LegacyOutputIterator とは異なり、マルチパスアルゴリズムで使用できます。
LegacyForwardIterator it が Container に由来する場合、 it の値型はコンテナの値型と同じであるため、デリファレンス( * it )によってコンテナの値型が得られます。
目次 |
要件
| 型 | 定義 |
X
|
前方イテレータ型 |
T
|
X
の
値型
(すなわち
std::
iterator_traits
<
X
>
::
value_type
)
|
Ref
|
std:: iterator_traits < X > :: reference |
| 値 | 定義 |
| i 、 j |
X
型または
const
X
型の値
|
| r |
X&
型の値
|
X
は以下の条件をすべて満たす場合、
LegacyForwardIterator
を満たします:
-
Xは LegacyInputIterator を満たす。 -
Xは DefaultConstructible を満たす。 -
Xが 変更可能なイテレータ である場合、RefはTへの参照である。 -
Xが定数イテレータである場合、Refは const T への参照である。 -
X型のオブジェクトは マルチパス保証 を提供する。 - i と j が等しい場合、 i と j の両方が デリファレンス可能 であるか、あるいはどちらもデリファレンス可能でないかのいずれかである。
- i と j の両方がデリファレンス可能である場合、 i == j であるのは * i と * j が同じオブジェクトにバインドされている場合に限る。
- 以下の式は有効であり、指定された効果を持たなければならない:
| 式 | 型 | 効果 |
|---|---|---|
| r ++ | convertible to const X & |
次と等価:
X x
=
r
;
++ r ; return x ; . |
| * i ++ |
Ref
|
等価性ドメイン
前方イテレータにおける domain の == は、同じ underlying sequence 上のイテレータに適用されます。
|
しかしながら、 value-initialized 前方イテレータは比較可能であり、同じ型の他の value-initialized イテレータと等しく比較されなければなりません。 言い換えれば、value-initialized 前方イテレータは、同じ空のシーケンスの終端を指しているかのように振る舞います。 |
(C++14 以降) |
マルチパス保証
二つの逆参照可能なイテレータ
a
と
b
が型
X
において
マルチパス保証
を提供するのは、以下の全ての条件が満たされる場合です:
- a == b は ++ a == ++ b を意味する。
- 以下のいずれかの条件が満たされる:
-
-
Xはポインタ型です。 - 式 ( void ) ++ X ( a ) , * a は式 * a と等価です。
-
Conceptstd::iterator_traits の定義のために、以下の説明専用コンセプトが定義される。
説明専用コンセプト
|
(C++20以降) |
注記
std::forward_iterator コンセプトとは異なり、 LegacyForwardIterator 要件は間接参照が参照を返すことを要求します。
不具合報告
以下の動作変更の欠陥報告書は、以前に公開されたC++規格に対して遡及的に適用されました。
| DR | 適用対象 | 公開時の動作 | 正しい動作 |
|---|---|---|---|
|
LWG 1212
( N3066 ) |
C++98 |
*
i
++
の型が
LegacyBidirectionalIterator で要求される * i -- の型と一致していなかった |
型を
Ref
に変更
|
|
LWG 1311
( N3066 ) |
C++98 |
「
a
==
b
は
++
a
==
++
b
を意味する」だけでは
マルチパス保証を提供しない [1] |
「
a
==
b
は
++ a ! = b を意味する」も要求 [2] |
| LWG 3798 | C++20 |
__LegacyForwardIterator
は
std:: iter_reference_t < It > が左辺値参照型であることを要求 |
右辺値参照型も
許可する |
- ↑ a と b が同じ基盤イテレータを使用するシナリオにおいて、式 ++ a == ++ b を評価すると、実際には基盤コンテナが2回インクリメントされるが、結果は依然として true となる。
- ↑ 形式的には ++ b ! = a を含意することも必要とされる。
関連項目
|
(C++20)
|
input_iterator
が前方イテレータであることを指定し、等値比較とマルチパスをサポートする
(コンセプト) |
| Iterator library | イテレータ、イテレータ特性、アダプタ、およびユーティリティ関数の定義を提供する |