関数テンプレートが ADL 検出に抵抗する理由
C では、引数依存検索 (ADL) により、コンパイラは明示的な名前空間修飾なしで関数を見つけることができます。ただし、関数テンプレートに関しては、ADL は制限に直面します。
この核心は、C 標準 03 の 14.8.1.6 に記載されています:
"しかし、関数テンプレートに明示的なテンプレート引数が指定されている場合、が使用されている場合、呼び出しの時点でその名前の関数テンプレートが表示されていない限り、呼び出しは正しい構文形式を持ちません。 call."
例で詳しく見てみましょう:
次のスニペットでは、名前空間 ns:
namespace ns { struct foo {}; template<int i> void frob(foo const&) {} void non_template(foo const&) {} }non_template を直接呼び出すことは許可されますが、frob<0> を呼び出そうとすることはできません。 foo のオブジェクトに対する関数はコンパイルに失敗します。なぜですか?名前空間修飾なしでは呼び出し frob<0>(f) が構文的に無効だからです。明示的な名前空間がないと、コンパイラは ADL 中にどの frob テンプレートを見つけるべきかを認識できません。これを修正するには、frob の呼び出しを明示的に修飾するか、using を使用して名前空間をスコープに含める必要があります。そうすることで、コンパイラは ADL を使用して正しいテンプレート定義を見つけることができます。
以上が引数依存検索 (ADL) が明示的な名前空間修飾なしで関数テンプレートを検索しないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。