Name lookup
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 nombresstd -
búsqueda de nombre calificada para el nombre
endl, que encuentra una declaración de plantilla de función en el espacio de nombresstd -
tanto
búsqueda dependiente de argumento
para el nombre
operator<<, que encuentra múltiples declaraciones de plantillas de función en el espacio de nombresstd, 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
-
- (lo cual, para nombres de funciones, incluye Argument-dependent lookup )
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
- Ámbito
- Búsqueda dependiente de argumento (ADL)
- Deducción de argumentos de plantilla
- Resolución de sobrecarga
|
Documentación de C
para
Búsqueda y espacios de nombres
|