なぜヘッダーがなく、存在しないことを欠陥と見なすことができるのはなぜですか?

StackOverflow https://stackoverflow.com/questions/6313771

質問

標準ライブラリには、 <iosfwd> ヘッダー、それは(フォワード)を含むすべてのストリームを宣言します typedefsおよび定義します char_traits 専門化を含むテンプレート。

悲しいことに、そのようなものはありません <stlfwd> (フォワード)のヘッダーは、すべての一般的なSTLデータ型と関数を次のように宣言します vector, map, less, sort, さらに悲しいことに、ユーザーコードはそのような宣言を追加することは許可されていません / typedefsに std 名前のように、名前空間

§17.4.3.1 [lib.reserved.names] p1:

C + +プログラムが追加されるのは未定義です 宣言 または名前空間への定義 std または名前空間内の名前空間 std 特に指定しない限り。プログラムは、名前空間に標準ライブラリテンプレートのテンプレートの専門化を追加する場合があります std.

YEPは、標準ライブラリにタイプが既に存在する場合でも、(フォワード)宣言の場合をカバーします。もちろん、ほとんどの(すべて?)コンパイラは、そのような宣言を追加しても完全に正常に動作しますが、厳密に言語弁護士が話していると、それは未定義の行動です。これは特に退屈だと思います typedef次のような標準コンテナ

// how to forward declare map and string?

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

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

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

また、によると この質問, 、1つ(前方)が標準のコンテナ、アルゴリズム、および機能者 /機能を標準の要求とまったく同じように宣言する場合、コードは完全に有効である必要があります(ユーザーメイドの宣言が禁止されていない場合は、 std 名前空間)、実装が非表示/デフォルトのテンプレートパラメーターを追加することは許可されていないためです。

最終的にこれに関する欠陥報告書を提出することを考えているので、私はこれを尋ねています。

役に立ちましたか?

解決

フォワード宣言の目的は何でしょうか less また sort または本当に他のアルゴリズムはありますか?その周りに汎用アルゴリズムを渡す場合、ほぼ間違いなくテンプレートタイプとして、フォワード宣言はまったく必要ありません。

コンテナタイプが残ります。それらのフォワード宣言が有用である場合は間違いなくありますが、各コンテナ定義が比較的単純であるため(iOSTREAMと比較して)、単に完全なインクルードを使用するよりも使用することが望ましいと判断されたと思います。u003Ccontainerfwd>たとえば、含める。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top