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

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

Susan Sarandon
リリース: 2024-12-11 12:42:12
オリジナル
413 人が閲覧しました

Why Does Argument-Dependent Lookup (ADL) Fail to Find Function Templates with Explicit Template Arguments?

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

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