2

フェーズ 7: トークンを区切る空白文字はもはや重要ではありません。各前処理トークンはトークンに変換されます。結果のトークンは、構文的および意味的に分析され、翻訳単位として翻訳されます。

フェーズ 8: 翻訳された翻訳単位とインスタンス化単位は、次のように結合されます。翻訳された各翻訳単位を調べて、必要なインスタンス化のリストを作成します。必要なテンプレートの定義が配置されています。これらの定義を含む翻訳単位のソースが利用可能である必要があるかどうかは、実装によって定義されます。インスタンス化単位を生成するために、必要なすべてのインスタンス化が実行されます。—終わりの注] インスタンス化が失敗した場合、プログラムは不正な形式です。

貼り付けたテキストを短くするために、メモの一部を削除しました。

C++ のコンパイル フェーズ 8 で翻訳単位が既に翻訳された後に、テンプレートの検索とインスタンス化が実行されるのはなぜですか? これらのステップは、2 フェーズの名前ルックアップを考慮して、フェーズ 7 で行うべきではありませんか?

4

2 に答える 2

0

この部分は、テンプレート化された型のプリコンパイルに関係していると思います。テンプレート化された型はすべて「インスタンス化ユニット」になります。テンプレート化された型がコンパイル済みの場合、このフェーズで処理する必要があります。

于 2012-09-30T21:38:43.603 に答える
0

これは、非推奨になっ たテンプレートのエクスポート機能からの持ち越しです。エクスポート テンプレートにより、(適切な意味で) クラスおよび関数テンプレートの定義をそれらの宣言とは別に配置することができました。

実装の詳細として、翻訳単位の翻訳をテンプレートのインスタンス化から分離することは、テンプレートのインスタンス化の冗長な作業を減らすことができるため、理にかなっています。ただし、最新のコンパイラのほとんどは、翻訳単位の変換時にすべてのテンプレートをインスタンス化し、リンク時にインスタンス化の重複を排除します。

コンセプトとモジュールにより、同様の機能が将来的に言語に再導入されることが期待されています。

于 2012-10-01T17:50:24.443 に答える