C++ 標準でテンプレートの 2 フェーズ ルックアップが定義されているのはなぜですか? 非依存の宣言と定義のルックアップもインスタンス化の段階まで延期できませんでしたか?
2 に答える
彼らはできた。これは、テンプレートのほとんどの初期の実装が機能した方法であり、Microsoftコンパイラが機能した方法でもあります。(委員会では)これはエラーが発生しやすいと感じられました。誤って名前を乗っ取るのは簡単すぎて、1つの翻訳ユニットでインスタンス化すると、目的のグローバルシンボルではなく、ローカル名が取得されました。(一般的な翻訳単位は、すべての人に表示される名前を宣言する一連の#include
sと、それに続く実装コードで構成されます。インスタンス化の時点で、実装コードを含め、インスタンス化の時点より前のすべてが表示されます。)
最終的な決定は、テンプレート内のシンボルを依存と非依存の2つのカテゴリに分類し、非依存のシンボルがテンプレートの定義の時点で解決されるように主張して、誤ってバインドされるリスクを減らすことでした。いくつかのローカル実装シンボルに。これにより、依存するシンボルを指定する必要が
typename
ありtemplate
、適切な場合は、テンプレートがインスタンス化されるときだけでなく、テンプレートの定義の時点で解析とエラーチェックが可能になります。
これは、関心の分離の適用と見なすことができます。
ここで説明されているように、最初のフェーズでは正しい構文をチェックし、依存しない名前を解決します。2 番目のフェーズでは、特定の型で呼び出しが有効かどうかを確認して、よりテンプレート固有の処理を行います。この [回答] を参照してください ( 2 フェーズ ルックアップ - 説明が必要です)
さらに、1 つのフェーズでのみ実行する場合は、インスタンス化ごとに実行する必要があります。この方法は一度だけ実行されます。
最初のインスタンス化でのみ実行される場合は、構造化されていないだけで同じことになります。