Namespaces
Variants

Name lookup

From cppreference.net
C++ language
General topics
Flow control
Conditional execution statements
Iteration statements (loops)
Jump statements
Functions
Function declaration
Lambda function expression
inline specifier
Dynamic exception specifications ( until C++17* )
noexcept specifier (C++11)
Exceptions
Namespaces
Types
Specifiers
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Storage duration specifiers
Initialization
Expressions
Alternative representations
Literals
Boolean - Integer - Floating-point
Character - String - nullptr (C++11)
User-defined (C++11)
Utilities
Attributes (C++11)
Types
typedef declaration
Type alias declaration (C++11)
Casts
Memory allocation
Classes
Class-specific function properties
Special member functions
Templates
Miscellaneous

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 namespace std
  • recherche de nom qualifié pour le nom endl , qui trouve une déclaration de template de fonction dans le namespace std
  • à la fois recherche dépendante des arguments pour le nom operator<< , qui trouve plusieurs déclarations de templates de fonctions dans le namespace std , 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

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

Documentation C pour Recherche et espaces de noms