Maison >développement back-end >C++ >Pourquoi la recherche dépendante des arguments (ADL) échoue-t-elle pour les modèles de fonctions C ?

Pourquoi la recherche dépendante des arguments (ADL) échoue-t-elle pour les modèles de fonctions C ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-12-11 08:48:11698parcourir

Why Does Argument-Dependent Lookup (ADL) Fail for C   Function Templates?

Échec de l'ADL dans la recherche de modèles de fonctions

En C, la recherche dépendante de l'argument (ADL) permet la recherche de déclarations de noms de fonctions dans le espaces de noms associés aux arguments dans un appel de fonction. Cependant, il existe une restriction dans la spécification C en ce qui concerne les modèles de fonctions et l'ADL.

La restriction

Selon la norme C 14.8.1.6, l'ADL ne s'applique aux modèles de fonction, sauf s'il existe un modèle de fonction visible portant le même nom au moment de l'appel. Cela signifie que, pour les modèles de fonction avec des arguments de modèle explicites, l'appel doit avoir la forme syntaxique correcte avec un modèle de fonction visible.

Exemple

Considérez l'exemple suivant :

namespace ns {
    struct foo {};
    template<int i> void frob(foo const&amp;) {}
    void non_template(foo const&amp;) {}
}

int main() {
    ns::foo f;
    non_template(f); // This is fine.
    frob<0>(f); // This is not.
}

Dans cet exemple, ADL trouve et résout non_template pour le premier appel car non_template est une fonction ordinaire. Cependant, pour le deuxième appel, frob est un modèle de fonction. Puisqu'il n'y a pas de modèle de fonction frob visible au moment de l'appel, ADL échoue et l'appel n'est pas syntaxiquement bien formé.

Réponse à la restriction

À Pour surmonter cette restriction, assurez-vous que le modèle de fonction est visible dans la portée de l'appel. Ceci peut être réalisé en déclarant le modèle de fonction dans l'espace de noms actuel ou en qualifiant l'appel avec l'espace de noms contenant le modèle de fonction.

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!

Déclaration:
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