C の引数依存検索と関数テンプレート
引数依存検索 (ADL) は、コンパイラーが識別子を検索できるようにする言語機能です。関数呼び出しの引数に関連付けられた名前空間内。通常、ADL は関数を検索しますが、シナリオによっては関数テンプレートの検索に失敗します。
C 標準の説明
C 標準 (2003) のセクション 14.8.1.6 には次のように記載されています。それ:
「しかし、明示的なテンプレート引数を持つ関数テンプレートが使用される場合、呼び出しには呼び出しの時点でその名前の関数テンプレートが表示されない限り、正しい構文形式が返されます。そのような名前が表示されない場合、呼び出しは構文的に正しくなく、引数に依存した検索は適用されません。"
例
次の例を考えてみましょう:
namespace ns { struct foo {}; template<int i> void frob(foo const&) {} void non_template(foo const&) {} } int main() { ns::foo f; non_template(f); // This is fine. frob<0>(f); // This is not. }
main の最後の呼び出し (frob<0>(f);) は、呼び出しのスコープ内に frob という名前の関数テンプレートが表示されないため、コンパイルに失敗します。 ADL はフロブを見つけることができません関数テンプレートは、コンパイラの構文によって有効な関数呼び出しとはみなされないためです。
追加の考慮事項
以上がC で引数依存ルックアップが明示的なテンプレート引数を持つ関数テンプレートを見つけられないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。