標準ライブラリには、<iosfwd>
を含むすべてのストリームを (前方に) 宣言し、特殊化を含むテンプレートtypedef
を定義するヘッダーが含まれています。char_traits
悲しいことに、、、、など<stlfwd>
のすべての一般的な STL データ型と関数を (前方に) 宣言するようなヘッダーはあり ません。vector
map
less
sort
typedef
std
§17.4.3.1 [lib.reserved.names] p1
:
特に指定がない限り、C++ プログラムが名前空間または名前空間内の名前空間に宣言または定義を追加することは定義されていません。プログラムは、標準ライブラリ テンプレートのテンプレートの特殊化を namespace に追加できます。
std
std
std
そうです、型が標準ライブラリに既に存在する場合でも、(前方) 宣言の場合をカバーします。もちろん、ほとんどの (すべての?) コンパイラーは、そのような宣言を追加しても完全に正常に動作しますが、厳密に言えば、言語弁護士の話では、未定義の動作です。typedef
これは、次のような標準コンテナでは特に面倒です。
// how to forward declare map and string?
typedef std::map<std::string, std::string> Attributes;
さて、これは欠陥と見なすことができますか?
私は、<stlfwd>
ヘッダーが存在しないこと (または、より適切には<stdfwd>
、カバー<iosfwd>
も) と、標準ライブラリーに既に存在する宣言の禁止の両方を意味します。
また、この質問によれば、標準コンテナ、アルゴリズム、およびファンクタ/機能を標準で要求されているとおりに(前方に)宣言すると、コードは完全に有効になるはずです(これはstd
、実装が非表示/デフォルトのテンプレート パラメータを追加することを許可されていないためです。
最終的にはこれに関する不具合報告を提出しようと考えているので、この質問をしています。