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&) {} void non_template(foo const&) {} }
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!