概要
2 フェーズ テンプレートのインスタンス化とも呼ばれます早期および後期ルックアップは、C テンプレート プログラミングの重要な側面です。しかし、この機能の Microsoft の Visual C (MSVC) 実装は、不適切であるとの報告で精査に直面しています。
理論上の 2 相ルックアップ
標準の C コンパイラでは、 2 フェーズ ルックアップは、テンプレート関数とクラスに適用されます。最初のフェーズでは、コンパイラーは構文チェックを実行し、適切な名前の宣言を識別します。実際の名前の検索とバインドは、テンプレートのインスタンス化中に発生する第 2 フェーズまで延期されます。
MSVC の限定的な実装
予想に反して、MSVC のテンプレート検索は制限されています。 。最初のフェーズでは、基本的な構文チェックのみが実行されます。問題は第 2 フェーズで発生し、次のことが失敗します。
壊れたルックアップの結果
2 フェーズの欠陥のある実装MSVC でのルックアップは、テンプレートのインスタンス化中にエラーを引き起こす可能性があります。たとえば、次のコードについて考えてみましょう。
int foo(void*); template<typename T> struct S { S() { int i = foo(0); } }; void foo(int); int main() { S<int> s; }
この例では、標準準拠のコンパイラが早期ルックアップを実行し、コンストラクター内で 'foo(0)' を 'foo(void*)' にバインドします。ただし、MSVC はインスタンス化までルックアップを延期し、'foo' のあいまいなオーバーロードによりコンパイル エラーを引き起こします。
結論
一方、MSVC は 2 つの基本的な実装を提供します。 -phase テンプレート ルックアップでは、標準の期待を下回っています。不完全な初期ルックアップと非 ADL ルックアップの誤った拡張によりエラーが発生し、MSVC ベースのプロジェクトでのテンプレートの使いやすさが制限される可能性があります。この環境でテンプレートベースのコードを効果的に処理するには、これらの制限を理解することが重要です。
以上がMicrosoft Visual C の 2 フェーズ テンプレート ルックアップは標準とどのように異なり、その結果は何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。