ホームページ > バックエンド開発 > C++ > Microsoft Visual C の 2 フェーズ テンプレート ルックアップは標準とどのように異なり、その結果は何ですか?

Microsoft Visual C の 2 フェーズ テンプレート ルックアップは標準とどのように異なり、その結果は何ですか?

Susan Sarandon
リリース: 2024-12-07 15:52:13
オリジナル
528 人が閲覧しました

How Does Microsoft Visual C  's Two-Phase Template Lookup Differ from the Standard, and What are the Consequences?

Microsoft Visual C での誤解されている 2 フェーズ テンプレートの検索

概要

2 フェーズ テンプレートのインスタンス化とも呼ばれます早期および後期ルックアップは、C テンプレート プログラミングの重要な側面です。しかし、この機能の Microsoft の Visual C (MSVC) 実装は、不適切であるとの報告で精査に直面しています。

理論上の 2 相ルックアップ

標準の C コンパイラでは、 2 フェーズ ルックアップは、テンプレート関数とクラスに適用されます。最初のフェーズでは、コンパイラーは構文チェックを実行し、適切な名前の宣言を識別します。実際の名前の検索とバインドは、テンプレートのインスタンス化中に発生する第 2 フェーズまで延期されます。

MSVC の限定的な実装

予想に反して、MSVC のテンプレート検索は制限されています。 。最初のフェーズでは、基本的な構文チェックのみが実行されます。問題は第 2 フェーズで発生し、次のことが失敗します。

  • 早期検索の実行: MSVC は、非依存名のチェックを延期するため、早期検索に完全には準拠していません。テンプレートのインスタンス化まで。
  • 非 ADL ルックアップの拡張: 第 2 フェーズでは、 MSVC は、非 ADL ルックアップを誤って拡張して、テンプレート定義の後に追加された宣言を含めます。この動作は、ADL で指定された名前空間の拡張のみを許可する標準から逸脱しています。

壊れたルックアップの結果

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート