9

出力反復子の要件をさらに満たす反復子は、可変反復子と呼ばれます。変更不可能な反復子は、定数反復子と呼ばれます。[24.2.1:4]

これは、入力イテレーターと出力イテレーターの両方の要件を満たす可変入力イテレーターを使用できることを示唆しています。

入力反復子をインクリメントした後、その古い値のコピーは逆参照可能である必要はありません [24.2.3]。ただし、標準では、出力反復子について同じことは述べられていません。実際、後置インクリメントの動作セマンティクスは として与えられ{ X tmp = r; ++r; return tmp; }、出力イテレータが古いイテレータ値を無効化 (コピー) しない可能性があることを示唆しています。

では、変更可能な入力反復子をインクリメントすると、古い反復子のコピーが無効になるのでしょうか?

X a(r++); *a = tもしそうなら、プロキシオブジェクトのような、またはプロキシオブジェクトを使ったコードをどのようにサポートX::reference p(*r++); p = tしますか?

boost::iteratorそうでない場合、プロキシ オブジェクトが必要であると主張するのはなぜですか? (リンクはコードです。下にスクロールして、とstructのコメントを読んでください)。つまり、古い反復子の値の (逆参照可能な) コピーを返すことができる場合、なぜこのコピーをプロキシでラップする必要があるのでしょうか?writable_postfix_increment_proxypostfix_increment_result

4

2 に答える 2

6

次のセクション [24.2.5] 前方イテレータにある場合の説明。ここでは、これらが入力イテレータと出力イテレータとどのように異なるかが述べられています。

2 つの参照解除可能なイテレータaおよびbタイプは、次の場合にマルチパス保証Xを提供します。

—および —がポインター型であるか、式が式と同等であることをa == b意味します。++a == ++b
X(void)++X(a), *a*a

[ 注: (入力および出力イテレーターには当てはまらない)ことをa == b暗示する要件と、可変イテレーター (出力イテレーターに適用される) を介した代入数の制限の削除により、マルチパスワンパスの使用が許可されます。++a == ++b前方イテレータを使用した方向性アルゴリズム。—終わりのメモ]

残念ながら、標準は全体として読む必要があり、説明は常に期待どおりの場所にあるとは限りません。

于 2012-08-13T06:41:45.240 に答える
4

入力イテレータと出力イテレータは、基本的にシングルパス トラバーサルを許可するように設計されています。つまり、各要素を 1 回しか訪問できないシーケンスを記述します。

ストリームはその好例です。標準入力またはソケットから読み取る場合、またはファイルに書き込む場合は、ストリームの現在の位置しかありません。反復子をインクリメントすると、同じ基になるシーケンスを指す他のすべての反復子が無効になります。

前方イテレータは、必要な追加の保証であるマルチパス トラバーサルを許可します。イテレータをコピーし、オリジナルをインクリメントし、コピーが古い位置を指し続けるため、そこから反復できることが保証されます。

于 2012-08-13T08:14:05.850 に答える