Name lookup
La recherche de nom est la procédure par laquelle un nom , lorsqu'il est rencontré dans un programme, est associé à la déclaration qui l'a introduit.
Par exemple, pour compiler std:: cout << std:: endl ; , le compilateur effectue :
-
recherche de nom non qualifié pour le nom
std, qui trouve la déclaration du namespace std dans l'en-tête <iostream> -
recherche de nom qualifié pour le nom
cout, qui trouve une déclaration de variable dans le namespacestd -
recherche de nom qualifié pour le nom
endl, qui trouve une déclaration de template de fonction dans le namespacestd -
à la fois
recherche dépendante des arguments
pour le nom
operator<<, qui trouve plusieurs déclarations de templates de fonctions dans le namespacestd, et recherche de nom qualifié pour le nom std :: ostream :: operator << , qui trouve plusieurs déclarations de fonctions membres dans la classe std::ostream .
Pour les noms de fonctions et de modèles de fonctions, la recherche de nom peut associer plusieurs déclarations au même nom, et peut obtenir des déclarations supplémentaires via la recherche dépendante des arguments . La déduction d'arguments de template peut également s'appliquer, et l'ensemble des déclarations est transmis à la résolution de surcharge , qui sélectionne la déclaration qui sera utilisée. Les règles d' accès aux membres , si applicables, ne sont considérées qu'après la recherche de nom et la résolution de surcharge.
Pour tous les autres noms (variables, espaces de noms, classes, etc.), la recherche de nom ne peut associer plusieurs déclarations que si elles déclarent la même entité , sinon elle doit produire une seule déclaration pour que le programme puisse compiler. La recherche d'un nom dans une portée trouve toutes les déclarations de ce nom, à une exception près, connue sous le nom de "struct hack" ou "masquage type/non-type" : Dans la même portée, certaines occurrences d'un nom peuvent se référer à une déclaration de classe/struct/union/enum qui n'est pas un typedef , tandis que toutes les autres occurrences du même nom se réfèrent soit toutes à la même variable, membre de données non statique ou énumérateur, soit elles se réfèrent toutes à des noms de fonction ou de modèle de fonction potentiellement surchargés. Dans ce cas, il n'y a pas d'erreur, mais le nom de type est masqué lors de la recherche (le code doit utiliser un spécificateur de type élaboré pour y accéder).
Types de recherche
Si le nom apparaît immédiatement à droite de l'opérateur de résolution de portée
::
ou éventuellement après
::
suivi du mot-clé de désambiguïsation
template
, voir
Sinon, consultez
-
- (ce qui, pour les noms de fonctions, inclut Argument-dependent lookup )
Rapports de défauts
Les rapports de défauts modifiant le comportement suivants ont été appliqués rétroactivement aux normes C++ précédemment publiées.
| DR | S'applique à | Comportement publié | Comportement corrigé |
|---|---|---|---|
| CWG 2063 | C++98 | Le "struct hack" ne s'appliquait pas dans la portée de classe (brise la compatibilité C) | appliqué |
| CWG 2218 | C++98 |
la recherche de noms non-fonction (template) ne pouvait pas associer
plusieurs déclarations, même si elles déclarent la même entité |
autorisé |
Voir aussi
- Portée
- Recherche dépendante des arguments (ADL)
- Déduction des arguments de template
- Résolution de surcharge
|
Documentation C
pour
Recherche et espaces de noms
|