2012-12-27 9 views
7

ForwardIteratorsはOutputIteratorsである必要がありますか?私の現在のSTL実装(VS2012)はinput_iterator_tagoutput_iterator_tagの両方からforward_iterator_tagを派生していますが、標準[N3485]ではこの要件が見つかりません。フォワードイテレータ出力イテレータですか?

答えて

11

C++では、no、forwardイテレータは出力イテレータである必要はありません。出力イテレータの要件は、イテレータが満たすことができるイテレータ要件の残りの部分に関係なく、イテレータが持つことができる追加の一連の要件のようなものです。

場合クラスまたはポインタ型Xが前方反復子の要件を満たす:

  • Xは、の要件を満たす前方イテレータのみ入力イテレータ(§24.2.5/ 1)であることが要求されていますそれはsequenに変更可能なイテレータがある場合にのみ、入力イテレータ
  • ...実際には

は、前方イテレータは出力イテレータの要件を満たしていますコピーアサイナブルタイプの

†または可変メンバーで定義されたoperator=(...) constの型のシーケンスに対する定数反復子。ポイントに

より、イテレータタグは(§24.4.3/ 2)として標準で具体的に定義されています。

あなたが見ることができるように、forward_iterator_tagのみinput_iterator_tagから継承する必要があります。 C++ 03


、前方反復子は、入力と出力イテレータの要件を満たすことが記載されている:

フォワードイテレータは、入力と出力イテレータのすべての要件を満たして使用することができますいずれかの種類が指定されるといつでも

しかし、これは、一定の前進イテレータは出力イテレータの要件を満たしていないだろうと述べ、次の段落で矛盾している:そのカテゴリ、前方、双方向、またはランダムアクセスイテレータのほか

式* iの結果が参照として動作するか、定数への参照として動作するかに応じて、可変または一定にすることもできます。定数イテレータは出力イテレータの要件を満たさず、* i(定数イテレータi)の式の結果は左辺値が必要な式では使用できません。

ただし、イテレータタグの定義はC++ 11と同じです。この矛盾した文言のためにdefect reportがありましたが、最初の引用がセクションの「導入テキスト」にあり、今後これを改訂する可能性が高いため、欠陥ではありません。


SGI definition of a forward iteratorは、入力と出力の両方のイテレータ(コメントで@BenVoigtのおかげで)の改良として与えられます。

でも、implementation of the iterator tagsを見ると、forward_iterator_tagはまだinput_iterator_tagから継承されています。

これは、過去の混乱のかなりの領域であったが、VS2012はoutput_両方から継承するようforward_iterator_tagを定義している場合のように見える - とinput_iterator_tag、私はそれがバグであると仮定することができます。

+0

しかし、これは、ドキュメントがForwardIteratorが「InputIteratorとOutputIteratorの改良」であると述べているSGI定義とは異なるように見えることに注意してください。つまり、ForwardInputIteratorとForwardOutputIteratorが存在しますが、 –

+0

@BenVoigtこれはC++ 03とC++ 11の間で変更されたようです。編集:実際には、それは混乱して待ってください。 –

+0

@sftrabbit:それをクリアしてくれてありがとう。イテレータを前方と出力の両方としてタグ付けする標準的な方法は何ですか? (単に、両方から継承する新しいプライベートタグを導入するか、あるいは別の方法がありますか?) – MFH

関連する問題