5

(優れた) 質問C++ OutputIterator ポストインクリメント要件 に従って、型の逆参照可能でインクリメント可能な値、および適切な型の値rについて、次の式を観察します。OutputIteratorXo

*r++ = o;

有効であり、同等のセマンティクスを持っています

X a(r);
++r;
*a = o;

ただし、その間に が複数回インクリメントされた場合、a逆参照割り当て可能であることに変わりはありません。rつまり、このコードは有効ですか?

X a(r);
++r;
++r;
*a = o;

値に対する操作が別の値に対する操作の有効性にどのように影響するかを理解するのは困難ですが、たとえばInputIterator(24.2.3) は、の事後条件の下で++r:

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

関連セクション: 24.2.2 イテレーター24.2.4 出力イテレーター17.6.3.1 テンプレート引数の要件

また、これが有効である必要がないOutputIterator場合、既存の要件を守りながら、その非有効性を利用することで型の実装 (効率性、単純さ) が向上する状況はありますか?

4

1 に答える 1

2

この問題は 2004 年に欠陥 485として提起され、 n3066の文言は問題を明確にし、出力反復子が交互のインクリメントと逆参照/代入のシーケンスのみをサポートする必要があることを要求します。したがって、あなたの例では、介在する逆参照/割り当てがない限りr、最初の の後にインクリメント可能である必要はありません。++rこの動作は、SGI のSTLでも必要です(脚注 3 を参照)。上で述べたように、n3225 は n3066 からの修正なしで出現したため、欠陥 2035が発生しました。残念ながら、この修正は C++11 (ISO/IEC 14882:2011) の公開バージョンには反映されませんでした。

さらに、欠陥 2035 によると、a(from X a(r++);) は次のように使用できません*a = 0

「この操作の後 [ie, ++r]rはインクリメント可能である必要はなく、 の以前の値のコピーはr参照解除可能またはインクリメント可能である必要はありません。」

これが実装に役立つ場合があります (単純さの点で) :たとえば、 に関するこの質問を参照しください。逆参照/代入のみがを実際にインクリメントします。ostream_iterator*thisostream_iterator

于 2012-08-13T17:06:47.827 に答える