C++ の名前付き要件: 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++ | const X& に変換可能 | X x = r; ++r; return x; と同等です。 |
| *i++ | Ref
|
[編集] 等値ドメイン
フォワードイテレータの == の ドメイン は、同じ 基底シーケンス を反復処理するイテレータのドメインです。
|
ただし、値初期化された フォワードイテレータは比較可能であり、同じ型の他の値初期化されたイテレータと等しく比較されなければなりません。 言い換えれば、値初期化されたフォワードイテレータは、同じ空のシーケンスの末尾を超えた位置を参照しているかのように動作します。 |
(C++14以降) |
[編集] マルチパス保証
型 X の2つの間接参照可能なイテレータ a と b は、以下のすべての条件が満たされている場合に、マルチパス保証 を提供します。
- a == b は ++a == ++b を意味します。
- 以下のいずれかの条件が満たされる。
-
Xはポインタ型です。 - 式 (void)++X(a), *a は式 *a と同等です。
-
コンセプトstd::iterator_traits の定義のために、以下の exposition-only コンセプトが定義されています。
ここで、exposition-only コンセプト |
(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 が、等価比較とマルチパスをサポートする前方イテレータであることを規定する(コンセプト) |
| イテレータライブラリ | イテレータ、イテレータ特性、アダプタ、およびユーティリティ関数の定義を提供します。 |