6

C++InputIteratorは、反復子の概念の最も限定されたタイプの 1 つです。逆参照、等価比較、プリインクリメントとポストインクリメント (およびポストインクリメントと逆参照) のサポートのみが保証されています。

InputIteratorオブジェクトは多くの場合、任意のストリームを反復するため、同じ入力を 2 回反復しても同じ値が得られるとは限りません 。

operator *ただし、反復子をインクリメントしないという条件で、逆参照演算子 が逆参照するたびに同じ値を返すことが保証されている場合、私は混乱しています。

たとえば、概念の要件を満たし、終了位置に等しくない、またはそれを超えていないstd::begin(some_input_stream)オブジェクトを返すと仮定します。InputIteratorit

auto it = std::begin(some_input_stream);
auto value1 = *it;
auto value2 = *it;
assert(value1 == value2);

value1と同じ値であることが保証されていますvalue2か? (もちろん、どのような型*itが生成されても、正常な等値比較セマンティクスを実装することを前提としています)

4

2 に答える 2

9

value1と同じ値であることが保証されていますvalue2か?

はい。実際、イテレータをコピーすることもできます。そのコピーは、イテレータの 1 つをインクリメントするまで同じ結果になることが保証されています。

auto it2 = it;
auto value3 = *it2;
assert(value3 == value1);

++it2;
auto value4 = *it; // ERROR: might not be dereferencable any more

これは*a、C++11 の表 107 (入力反復子の要件)の要件で指定されています。

a == b(a,b)が のドメインにある==場合、*aは と同等*bです。

そして、後++r

の以前の値のコピーは、r逆参照可能にする必要も、 のドメインにある必要もありません==

于 2013-09-09T12:28:44.663 に答える
0

私はそれがうまくいくに違いないと信じています。に課された要件InputIteratorにより、実装は最後に読み取られた値をキャッシュするように強制されます。これは、 によって返されoperator*ます。

于 2013-09-09T12:28:44.147 に答える