問題ステートメント:
ユーザーは一般的にMicrosoft Visual C (MSVC) は 2 フェーズのテンプレートのインスタンス化を正しく実装するのに苦労しているという懸念を表明しています。メカニズムのどのような特定の側面が期待どおりに動作しませんか?
背景:
2 フェーズのテンプレートのインスタンス化には、MSVC が実行すると報告されている初期構文チェックが含まれます。ただし、このチェックがテンプレート内で使用される名前が適切に宣言されているかどうかを検証するかどうかについては疑問が生じます。
説明:
実際、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 はこのプロセスを第 2 フェーズに延期し、foo(0) を foo(int) に誤ってバインドし、エラーが発生します。
さらに、MSVC の第 2 フェーズの実装は、2 つの点で言語仕様から逸脱しています。 :
namespace N { struct S {}; } void bar(void *) {} template <typename T> void foo(T *t) { bar(t); } void bar(N::S *s) {} int main() { N::S s; foo(&s); }
両方とも場合によっては、MSVC の動作は、テンプレートのインスタンス化の最初のフェーズと 2 番目のフェーズの間の指定された分離に違反します。この誤った実装は Visual Studio 2015 にも残ります。
以上がMicrosoft Visual C が 2 フェーズ テンプレートのインスタンス化を正しく実装できないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。