なぜヘッダーがなく、存在しないことを欠陥と見なすことができるのはなぜですか?
-
26-10-2019 - |
質問
標準ライブラリには、 <iosfwd>
ヘッダー、それは(フォワード)を含むすべてのストリームを宣言します typedef
sおよび定義します char_traits
専門化を含むテンプレート。
悲しいことに、そのようなものはありません <stlfwd>
(フォワード)のヘッダーは、すべての一般的なSTLデータ型と関数を次のように宣言します vector
, map
, less
, sort
, さらに悲しいことに、ユーザーコードはそのような宣言を追加することは許可されていません / typedef
sに 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>たとえば、含める。