Namensräume
Varianten
Aktionen

Namenssuche

Von cppreference.com
< cpp‎ | Sprache
 
 
C++ Sprache
Allgemeine Themen
Kontrollfluss
Bedingte Ausführungsaussagen
if
Iterationsanweisungen (Schleifen)
for
Bereichs-for (C++11)
Sprunganweisungen
Funktionen
Funktionsdeklaration
Lambda-Funktionsausdruck
inline-Spezifizierer
Dynamische Ausnahmespezifikationen (bis C++17*)
noexcept-Spezifizierer (C++11)
Ausnahmen
Namensräume
Typen
Spezifizierer
const/volatile
decltype (C++11)
auto (C++11)
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Speicherdauer-Spezifizierer
Initialisierung
Ausdrücke
Alternative Darstellungen
Literale
Boolesch - Ganzzahl - Gleitkommazahl
Zeichen - String - nullptr (C++11)
Benutzerdefinierte (C++11)
Dienstprogramme
Attribute (C++11)
Typen
typedef-Deklaration
Typalias-Deklaration (C++11)
Umwandlungen
Speicherzuweisung
Klassen
Klassenspezifische Funktionseigenschaften
explicit (C++11)
static

Spezielle Member-Funktionen
Templates
Sonstiges
 
 

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 Namespace std gefunden wird.
  • qualifizierte Namensauflösung für den Namen endl, wodurch eine Funktionsschablonendeklaration im Namespace std gefunden wird.
  • sowohl argumentabhängige Auflösung für den Namen operator<<, wodurch mehrere Funktionsschablonendeklarationen im Namespace std gefunden 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

[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

C-Dokumentation für Auflösung und Namensräume