3

観察 1: C++ 出力反復子では が必要ですが&r == &++r、入力反復子ではこの要件について言及されていません。[C++11: 24.2.{3,4}] を参照

観察 2: 順方向、双方向、およびランダム アクセス イテレータは、入力イテレータの要件 [24.2.{5,6,7}:1] を満たしますが、ミュータブルでない限り、必ずしも出力イテレータの要件を満たしません[24.2.1:4]。

観察 3: 双方向反復子は、要件&r == &--r[24.2.6] でプレフィックスのデクリメント操作を追加します。

では、定数の双方向イテレータは を満たさなければなら&r == &--rないが必ずしもそうとは限らないが&r == &++r可変双方向イテレータは両方を満たさなければならないというのは本当でしょうか?

この要件が実装に与える影響について教えてください。


以下の MvG は、私が本当に意図した質問をします。

  • 一定の Forward イテレータが満たさないことが理にかなっているのは&r == &++rいつですか?
4

2 に答える 2

1

これは、特定の実装を明示的に指定せずに、要件を策定する間接的な方法です。特に、プロキシ オブジェクトを返すことはできません&r == &++r++r結果は同じ反復子でなければなりません。

ここでは、通常の方法mutableとまったく逆ではありませんが、const書き込み可能であることを意味し、出力イテレータの要件についても言及しています。

もちろん、双方向イテレータは(定義により)++pとの両方をサポートする必要があります--pが、書き込み可能/変更可能である必要はありません。

カテゴリは、読み取り/書き込みと前方/後方移動の間で完全に直交しているわけではないため、個々の要件は独立していた可能性があるため、独立したものではありません。これにより、多少の混乱が生じます。

あなたの結論が観察から導かれるかどうかはわかりませんが、実装にとって重要な自由になるとは思いません。のようなものをサポートしなければならないという事実は 、ほとんどの制限*++pを設定します。*p++

于 2012-08-10T21:02:02.370 に答える
1

この要件が実装に与える影響について教えてください。

明らかな答えは、operator++()oroperator--()メソッドは でなければならずreturn *this、別の関数Foo& operator++(Foo& arg)はその引数を返さなければならないということです。これはどのような場合でも適切な処理であるため、ほとんどの実装では心配する必要はありません。

より複雑な問題は、「(前方入力などの) イテレータが上記のアプローチに従わないことがいつ意味を持つのか」ということです。私はまだ合理的な例を思い付くことができませんでした。定数入力反復子の場合でも、は反復子型への参照で++rなければなりません。したがって、@Bo Persson が彼の回答で述べたように、「プロキシ オブジェクト」の任意の形式は、そのプロキシ オブジェクトがイテレータ クラスのサブクラスである場合にのみ機能します。あまり意味がないようです。

&r == &++r出力イテレータの場合、要件が単純に忘れられたような気がします。仕様の作成者が、この要件が満たされない特定のユースケースを念頭に置いていたとは思えません。しかし、私は推測しているので、この質問に対するより信頼できる答えを楽しみにしています.

于 2012-08-10T21:22:29.037 に答える