Name lookup
Namenssuche ist das Verfahren, durch das ein Name , wenn er in einem Programm angetroffen wird, mit der Deklaration verknüpft wird, die ihn eingeführt hat.
Zum Beispiel, um std:: cout << std:: endl ; zu kompilieren, führt der Compiler folgende Schritte aus:
-
unqualifizierte Namenssuche für den Namen
std, die die Deklaration des Namespace std im Header <iostream> findet -
qualifizierte Namenssuche für den Namen
cout, die eine Variablendeklaration im Namespacestdfindet -
qualifizierte Namenssuche für den Namen
endl, die eine Funktions-Template-Deklaration im Namespacestdfindet -
sowohl
argumentabhängige Namenssuche
für den Namen
operator<<, die mehrere Funktions-Template-Deklarationen im Namespacestdfindet, als auch qualifizierte Namenssuche für den Namen std :: ostream :: operator << , die mehrere Member-Funktionsdeklarationen in der Klasse std::ostream findet.
Für Funktions- und Funktions-Template-Namen kann die Namenssuche mehrere Deklarationen mit demselben Namen assoziieren und kann zusätzliche Deklarationen durch argumentabhängige Suche erhalten. Template-Argumentableitung kann ebenfalls angewendet werden, und die Menge der Deklarationen wird an die Überladungsauflösung weitergegeben, die die zu verwendende Deklaration auswählt. Zugriffsregeln für Mitglieder , falls anwendbar, werden erst nach Namenssuche und Überladungsauflösung berücksichtigt.
Für alle anderen Namen (Variablen, Namespaces, Klassen, etc.) kann die Namenssuche mehrere Deklarationen nur dann verknüpfen, wenn sie dieselbe Entität deklarieren, andernfalls muss sie eine einzelne Deklaration liefern, damit das Programm kompiliert werden kann. Die Suche nach einem Namen in einem Gültigkeitsbereich findet alle Deklarationen dieses Namens, mit einer Ausnahme, bekannt als "Struct-Hack" oder "Typ/Nicht-Typ-Verdeckung": Innerhalb desselben Gültigkeitsbereichs können einige Vorkommen eines Namens auf eine Deklaration einer Klasse/Struct/Union/Enum verweisen, die kein typedef ist, während alle anderen Vorkommen desselben Namens entweder alle auf dieselbe Variable, nicht-statische Datenelement oder Enumerator verweisen, oder sie alle auf möglicherweise überladene Funktion oder Funktions-Template-Namen verweisen. In diesem Fall liegt kein Fehler vor, aber der Typname ist für die Suche verdeckt (der Code muss einen elaborated type specifier verwenden, um darauf zuzugreifen).
Arten der Namenssuche
Wenn der Name unmittelbar rechts vom Bereichsauflösungsoperator
::
oder möglicherweise nach
::
gefolgt vom disambiguierenden Schlüsselwort
template
erscheint, siehe
Andernfalls siehe
-
- (was, für Funktionsnamen, Argument-dependent lookup einschließt)
Fehlerberichte
Die folgenden verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.
| DR | Angewendet auf | Verhalten wie veröffentlicht | Korrektes Verhalten |
|---|---|---|---|
| CWG 2063 | C++98 | "struct hack" galt nicht im Klassenbereich (bricht C-Kompatibilität) | angewendet |
| CWG 2218 | C++98 |
Suche nach Nicht-Funktionsnamen (Template) konnte nicht mehrere
Deklarationen assoziieren, selbst wenn sie dieselbe Entität deklarieren |
erlaubt |
Siehe auch
- Gültigkeitsbereich
- Argumentabhängige Namenssuche (ADL)
- Template-Argumentableitung
- Überladenauflösung
|
C-Dokumentation
für
Namenssuche und Namensräume
|