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 búsqueda de nombre es el procedimiento mediante el cual un nombre , cuando se encuentra en un programa, se asocia con la declaración que lo introdujo.

Por ejemplo, para compilar std:: cout << std:: endl ; , el compilador realiza:

  • búsqueda de nombre no calificada para el nombre std , que encuentra la declaración del espacio de nombres std en el encabezado <iostream>
  • búsqueda de nombre calificada para el nombre cout , que encuentra una declaración de variable en el espacio de nombres std
  • búsqueda de nombre calificada para el nombre endl , que encuentra una declaración de plantilla de función en el espacio de nombres std
  • tanto búsqueda dependiente de argumento para el nombre operator<< , que encuentra múltiples declaraciones de plantillas de función en el espacio de nombres std , como búsqueda de nombre calificada para el nombre std :: ostream :: operator << , que encuentra múltiples declaraciones de funciones miembro en la clase std::ostream .

Para nombres de funciones y plantillas de función, la búsqueda de nombres puede asociar múltiples declaraciones con el mismo nombre, y puede obtener declaraciones adicionales de la búsqueda dependiente de argumentos . La deducción de argumentos de plantilla también puede aplicarse, y el conjunto de declaraciones se pasa a la resolución de sobrecarga , que selecciona la declaración que se utilizará. Las reglas de acceso a miembros , si son aplicables, se consideran solo después de la búsqueda de nombres y la resolución de sobrecarga.

Para todos los demás nombres (variables, namespaces, clases, etc), la búsqueda de nombres puede asociar múltiples declaraciones solo si declaran la misma entidad , de lo contrario debe producir una única declaración para que el programa pueda compilarse. La búsqueda de un nombre en un ámbito encuentra todas las declaraciones de ese nombre, con una excepción, conocida como el "struct hack" u "ocultamiento tipo/no-tipo": Dentro del mismo ámbito, algunas ocurrencias de un nombre pueden referirse a una declaración de una clase/struct/union/enum que no es un typedef , mientras que todas las demás ocurrencias del mismo nombre o bien se refieren todas a la misma variable, miembro de datos no estático, o enumerador, o todas se refieren a nombres de función o plantilla de función posiblemente sobrecargados. En este caso, no hay error, pero el nombre del tipo queda oculto de la búsqueda (el código debe usar especificador de tipo elaborado para acceder a él).

Tipos de búsqueda

Si el nombre aparece inmediatamente a la derecha del operador de resolución de ámbito :: o posiblemente después de :: seguido por la palabra clave de desambiguación template , consulte

De lo contrario, consulte

Informes de defectos

Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares publicados anteriormente de C++.

DR Aplicado a Comportamiento publicado Comportamiento correcto
CWG 2063 C++98 "struct hack" no se aplicaba en ámbito de clase (rompe compatibilidad con C) aplicado
CWG 2218 C++98 la búsqueda de nombres no-función (plantilla) no podía asociar
múltiples declaraciones, incluso si declaraban la misma entidad
permitido

Véase también

Documentación de C para Búsqueda y espacios de nombres