Maison >développement back-end >C++ >Pourquoi la recherche dépendante des arguments (ADL) ne trouve-t-elle pas les modèles de fonctions sans qualification explicite de l'espace de noms ?

Pourquoi la recherche dépendante des arguments (ADL) ne trouve-t-elle pas les modèles de fonctions sans qualification explicite de l'espace de noms ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-12-10 08:28:13847parcourir

Why Doesn't Argument-Dependent Lookup (ADL) Find Function Templates Without Explicit Namespace Qualification?

Pourquoi les modèles de fonctions résistent à la découverte ADL

En C, la recherche dépendante de l'argument (ADL) permet aux compilateurs de localiser des fonctions sans qualification explicite d'espace de noms. Cependant, lorsqu'il s'agit de modèles de fonctions, ADL est confronté à une limitation.

Le point crucial est capturé dans le 14.8.1.6 de C Standard 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 portant ce nom visible au point du call."

Décomposons-le avec un exemple :

Dans l'extrait suivant, nous avons un modèle de fonction frob et une fonction non-modèle non_template dans l'espace de noms ns :

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

Bien qu'invoquer directement non_template soit autorisé, tenter d'appeler frob<0> sur un objet de foo ne parvient pas à se compiler.

Pourquoi ?

Parce que l'appel frob<0>(f) est syntaxiquement invalide sans la qualification d'espace de noms. Sans un espace de noms explicite, le compilateur ne peut pas savoir quel modèle frob trouver pendant l'ADL.

Pour remédier à cela, il faut qualifier explicitement l'appel à frob ou amener l'espace de noms dans la portée en utilisant using. Ce faisant, le compilateur peut alors utiliser ADL pour localiser la définition de modèle correcte.

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