Maison > développement back-end > C++ > Pourquoi la recherche dépendante des arguments (ADL) ne parvient-elle pas à trouver des modèles de fonctions avec des arguments de modèle explicites ?

Pourquoi la recherche dépendante des arguments (ADL) ne parvient-elle pas à trouver des modèles de fonctions avec des arguments de modèle explicites ?

Susan Sarandon
Libérer: 2024-12-11 12:42:12
original
414 Les gens l'ont consulté

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

ADL et modèles de fonctions

La recherche dépendante de l'argument (ADL) joue un rôle important en C en facilitant la recherche automatique de fonctions et d'objets dans les espaces de noms associés en fonction des types d'arguments utilisés. Cependant, ce mécanisme présente des limites en ce qui concerne les modèles de fonctions.

Restriction sur la recherche de modèles de fonctions avec ADL

Le dernier appel dans l'extrait de code fourni ne parvient pas à être compilé en raison à une restriction dans la spécification C. Selon la section 14.8.1.6 de la norme C 03 :

"Mais lorsqu'un modèle de fonction avec des arguments de modèle explicites est utilisé, l'appel n'a pas la forme syntaxique correcte à moins qu'il n'y ait un modèle de fonction avec ce nom visible au moment de l'appel."

Cela signifie qu'ADL ne peut trouver que les modèles de fonctions visibles dans le cadre de l'appel. Dans l'exemple donné, frob<0> est un appel à un modèle de fonction avec des arguments de modèle explicites. Cependant, il n'y a pas de déclaration visible du modèle frob au point de l'appel dans main.

Distinction avec les noms de fonctions simples

La restriction ne s'applique pas aux noms de fonctions simples noms de fonctions. Pour de tels noms, ADL est utilisé même si la fonction n'est pas visible dans le cadre de l'appel. En effet, l'appel conserve toujours la forme syntaxique d'un appel de fonction.

Exemple

L'exemple suivant illustre davantage le comportement :

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
}
Copier après la connexion

Dans cet exemple, l'appel à f<3>(b) est mal formé car aucun modèle de fonction visible nommé f n'existe à ce stade. L'appel à A::f<3>(b) est bien formé car le modèle f est visible dans l'espace de noms A. L'appel à C::f<3>(b) est mal formé car l'ADL ne s'applique qu'aux noms non qualifiés. L'utilisation de la directive using pour alias C::f rend l'appel à f<3>(b) bien formé car le nom f est maintenant visible au point de l'appel.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal