ホームページ >バックエンド開発 >C++ >Microsoft Visual C が 2 フェーズ テンプレートのインスタンス化を正しく実装できないのはなぜですか?

Microsoft Visual C が 2 フェーズ テンプレートのインスタンス化を正しく実装できないのはなぜですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-12-07 21:56:12202ブラウズ

Why Does Microsoft Visual C   Fail to Correctly Implement Two-Phase Template Instantiation?

Microsoft Visual C における「壊れた」2 フェーズ テンプレートのインスタンス化の謎

問題ステートメント:

ユーザーは一般的に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 つの点で言語仕様から逸脱しています。 :

  1. 2 回目の実行中に蓄積された宣言を使用して非 ADL ルックアップを拡張します。フェーズ。
  2. 以下のコードの bar(t) などの依存式が、第 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(&amp;s);
}

両方とも場合によっては、MSVC の動作は、テンプレートのインスタンス化の最初のフェーズと 2 番目のフェーズの間の指定された分離に違反します。この誤った実装は Visual Studio 2015 にも残ります。

以上がMicrosoft Visual C が 2 フェーズ テンプレートのインスタンス化を正しく実装できないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。