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 ?
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 }
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!