ADL と関数テンプレート
引数依存検索 (ADL) は、関数とオブジェクトの自動検索を容易にすることで、C で重要な役割を果たします。使用される引数のタイプに基づいて、関連付けられた名前空間で。ただし、関数テンプレートに関しては、このメカニズムには制限があります。
ADL による関数テンプレートの検索に関する制限
提供されたコード スニペットの最後の呼び出しは、次の理由によりコンパイルに失敗します。 C 仕様の制限によるものです。 C 標準 03 のセクション 14.8.1.6 によると:
「しかし、明示的なテンプレート引数を持つ関数テンプレートが使用される場合、その名前の関数テンプレートが表示されない限り、呼び出しは正しい構文形式を持ちません。 "
これは、ADL が呼び出しのスコープ内で表示される関数テンプレートのみを検索できることを意味します。与えられた例では、frob<0>は、明示的なテンプレート引数を使用した関数テンプレートの呼び出しです。ただし、main の呼び出し時点では、frob テンプレートの目に見える宣言はありません。
単純な関数名との区別
この制限は、単純な関数名には適用されません。関数名。このような名前の場合、関数が呼び出しのスコープ内に表示されない場合でも、ADL が使用されます。これは、呼び出しが関数呼び出しの構文形式を維持しているためです。
例
次の例は、動作をさらに詳しく示しています。
namespace A { struct B { }; template<int X> void f(B); } namespace C { template<class T> void f(T t); } void g(A::B b) { f<3>(b); //ill-formed: not a function call A::f<3>(b); //well-formed C::f<3>(b); //ill-formed; argument dependent lookup // applies only to unqualified names using C::f; f<3>(b); //well-formed because C::f is visible; then // A::f is found by argument dependent lookup }
この例では、f という名前の可視関数テンプレートが存在しないため、f<3>(b) への呼び出しは不正な形式になっています。その点。 f テンプレートが A 名前空間内で表示されるため、A::f(b) への呼び出しは整形式です。 ADL は非修飾名にのみ適用されるため、C::f(b) の呼び出しは不正な形式になります。 C::f のエイリアスに using ディレクティブを使用すると、呼び出し時点で f の名前が表示されるため、f(b) への呼び出しが整形式になります。
以上が引数依存ルックアップ (ADL) が明示的なテンプレート引数を持つ関数テンプレートを見つけられないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。