ホームページ >バックエンド開発 >C++ >C で引数依存ルックアップが明示的なテンプレート引数を持つ関数テンプレートを見つけられないのはなぜですか?

C で引数依存ルックアップが明示的なテンプレート引数を持つ関数テンプレートを見つけられないのはなぜですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-12-09 05:42:10915ブラウズ

Why Does Argument Dependent Lookup Fail to Find Function Templates with Explicit Template Arguments in C  ?

C の引数依存検索と関数テンプレート

引数依存検索 (ADL) は、コンパイラーが識別子を検索できるようにする言語機能です。関数呼び出しの引数に関連付けられた名前空間内。通常、ADL は関数を検索しますが、シナリオによっては関数テンプレートの検索に失敗します。

C 標準の説明

C 標準 (2003) のセクション 14.8.1.6 には次のように記載されています。それ:

「しかし、明示的なテンプレート引数を持つ関数テンプレートが使用される場合、呼び出しには呼び出しの時点でその名前の関数テンプレートが表示されない限り、正しい構文形式が返されます。そのような名前が表示されない場合、呼び出しは構文的に正しくなく、引数に依存した検索は適用されません。"

次の例を考えてみましょう:

namespace ns {
    struct foo {};
    template<int i> void frob(foo const&amp;) {}
    void non_template(foo const&amp;) {}
}

int main() {
    ns::foo f;
    non_template(f); // This is fine.
    frob<0>(f); // This is not.
}

main の最後の呼び出し (frob<0>(f);) は、呼び出しのスコープ内に frob という名前の関数テンプレートが表示されないため、コンパイルに失敗します。 ADL はフロブを見つけることができません関数テンプレートは、コンパイラの構文によって有効な関数呼び出しとはみなされないためです。

追加の考慮事項

  • 単純な関数名 (テンプレート引数なし) の場合、ADL は依然として名前が表示されない場合でも関数テンプレートを検索します。
  • ただし、関数テンプレートが明示的なテンプレートで呼び出された場合引数を使用する場合、ADL が成功するには、その特定の名前を持つ関数テンプレートが呼び出しのスコープ内に表示されている必要があります。
  • 場合によっては、宣言を使用すると関数テンプレートが表示され、ADL がそれを見つけることができるようになります。

以上がC で引数依存ルックアップが明示的なテンプレート引数を持つ関数テンプレートを見つけられないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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