Namenssuche
Namensauflösung ist der Vorgang, bei dem ein Name, wenn er in einem Programm angetroffen wird, mit der Deklaration verbunden wird, die ihn eingeführt hat.
Um beispielsweise Folgendes zu kompilieren: std::cout << std::endl;, führt der Compiler Folgendes durch:
- nicht qualifizierte Namensauflösung für den Namen
std, wodurch die Deklaration des Namespace std in der Header-Datei <iostream> gefunden wird. - qualifizierte Namensauflösung für den Namen
cout, wodurch eine Variablendeklaration im Namespacestdgefunden wird. - qualifizierte Namensauflösung für den Namen
endl, wodurch eine Funktionsschablonendeklaration im Namespacestdgefunden wird. - sowohl argumentabhängige Auflösung für den Namen
operator<<, wodurch mehrere Funktionsschablonendeklarationen im Namespacestdgefunden werden, als auch qualifizierte Namensauflösung für den Namen std::ostream::operator<<, wodurch mehrere Mitgliedsfunktionsdeklarationen in der Klasse std::ostream gefunden werden.
Für Funktions- und Funktionsschablonennamen kann die Namensauflösung mehrere Deklarationen mit demselben Namen verknüpfen und zusätzliche Deklarationen aus der argumentabhängigen Auflösung erhalten. Schablonenargumentableitung kann ebenfalls angewendet werden, und die Menge der Deklarationen wird an die Überladungsauflösung übergeben, die die zu verwendende Deklaration auswählt. Mitgliedszugriffsregeln, falls zutreffend, werden erst nach Namensauflösung und Überladungsauflösung berücksichtigt.
Für alle anderen Namen (Variablen, Namespaces, Klassen usw.) kann die Namensauflösung mehrere Deklarationen nur dann verknüpfen, wenn sie dasselbe Objekt deklarieren, andernfalls muss sie eine einzige Deklaration ergeben, damit das Programm kompiliert werden kann. Die Auflösung eines Namens in einem Geltungsbereich findet alle Deklarationen dieses Namens, mit einer Ausnahme, bekannt als "struct hack" oder "type/non-type hiding": Innerhalb desselben Geltungsbereichs können einige Vorkommen eines Namens auf eine Deklaration einer Klasse/eines Structs/einer Union/einer Enum verweisen, die kein typedef ist, während alle anderen Vorkommen desselben Namens entweder alle auf dieselbe Variable, dasselbe nicht-statische Datenelement oder denselben Enumerator verweisen oder sie alle auf möglicherweise überladene Funktions- oder Funktionsschablonennamen verweisen. In diesem Fall gibt es keinen Fehler, aber der Typname ist von der Auflösung versteckt (der Code muss eine elaborierte Typspezifikation verwenden, um darauf zuzugreifen).
[bearbeiten] Arten der Auflösung
Wenn der Name unmittelbar rechts vom Bereichsauflösungsoperator :: oder möglicherweise nach :: gefolgt vom Unterscheidungsschlüsselwort template erscheint, siehe
Andernfalls siehe
- (was für Funktionsnamen die argumentabhängige Auflösung einschließt)
[bearbeiten] Fehlerberichte
Die folgenden Verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.
| DR | angewendet auf | Verhalten wie veröffentlicht | Korrigiertes Verhalten |
|---|---|---|---|
| CWG 2063 | C++98 | "struct hack" galt nicht im Klassenbereich (bricht C-Kompatibilität) | angewendet |
| CWG 2218 | C++98 | Auflösung für Nicht-Funktionsnamen (Schablonen) konnte nicht verknüpfen mehrere Deklarationen, auch wenn sie dasselbe Objekt deklarieren |
erlaubt |
[bearbeiten] Siehe auch
- Gültigkeitsbereich
- Argumentabhängige Auflösung (ADL)
- Schablonen-Argument-Deduktion
- Überladungsauflösung
| C-Dokumentation für Auflösung und Namensräume
|