10

標準ライブラリには、<iosfwd>を含むすべてのストリームを (前方に) 宣言し、特殊化を含むテンプレートtypedefを定義するヘッダーが含まれています。char_traits

悲しいことに、、、、など<stlfwd>のすべての一般的な STL データ型と関数を (前方に) 宣言するようなヘッダーはあり ません。vectormaplesssorttypedefstd

§17.4.3.1 [lib.reserved.names] p1:

特に指定がない限り、C++ プログラムが名前空間または名前空間内の名前空間に宣言または定義を追加することは定義されていません。プログラムは、標準ライブラリ テンプレートのテンプレートの特殊化を namespace に追加できます。stdstdstd

そうです、型が標準ライブラリに既に存在する場合でも、(前方) 宣言の場合をカバーします。もちろん、ほとんどの (すべての?) コンパイラーは、そのような宣言を追加しても完全に正常に動作しますが、厳密に言えば、言語弁護士の話では、未定義の動作です。typedefこれは、次のような標準コンテナでは特に面倒です。

// how to forward declare map and string?

typedef std::map<std::string, std::string> Attributes;

さて、これは欠陥と見なすことができますか?

私は、<stlfwd>ヘッダーが存在しないこと (または、より適切には<stdfwd>、カバー<iosfwd>も) と、標準ライブラリーに既に存在する宣言の禁止の両方を意味します。

また、この質問によれば、標準コンテナ、アルゴリズム、およびファンクタ/機能を標準で要求されているとおりに(前方に)宣言すると、コードは完全に有効になるはずです(これはstd、実装が非表示/デフォルトのテンプレート パラメータを追加することを許可されていないためです。

最終的にはこれに関する不具合報告を提出しようと考えているので、この質問をしています。

4

1 に答える 1

7

lesssayまたはsort本当に他のアルゴリズムを前方宣言する目的は何ですか? 汎用アルゴリズムを渡す場合は、ほぼ確実にテンプレート型であり、前方宣言はまったく必要ありません。

これで、コンテナーの種類が残ります。それらの前方宣言が役立つ場合は確かにありますが、各コンテナー定義は (iostream と比較して) 比較的単純であるため、<containerfwd> インクルードではなく完全なインクルードを使用する方が望ましいと単純に判断されたと思います。例えば。

于 2011-06-11T03:44:26.467 に答える