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

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 Namespace std findet
  • qualifizierte Namenssuche für den Namen endl , die eine Funktions-Template-Deklaration im Namespace std findet
  • sowohl argumentabhängige Namenssuche für den Namen operator<< , die mehrere Funktions-Template-Deklarationen im Namespace std findet, 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

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

C-Dokumentation für Namenssuche und Namensräume