Was hier vor sich geht, ist spezifisch für C ++. Die Verwendung von x
als Klassenname ist ausgeblendet.
Abschnitt 3.3.7 (Name Verstecke) Absatz 2:
Ein Klassenname (9.1) oder ein Enumerationsname (7.2) kann durch den Namen eines Objekts, einer Funktion oder eines Enumerators ausgeblendet werden, die im selben Bereich deklariert sind. Wenn ein Klassen- oder Enumerationsname und ein Objekt, eine Funktion oder ein Enumerator im selben Bereich (in beliebiger Reihenfolge) mit demselben Namen deklariert sind, wird der Klassen- oder Enumerationsname überall dort angezeigt, wo der Name des Objekts, der Funktion oder des Enumerators sichtbar ist / p>
Erster Fall: 2 Identifikatoren
%Vor%Zweiter Fall: 1 Bezeichner, 1 Typname
%Vor%Der Compiler kann den ersten Fall nicht behandeln, weil Sie zwei Bezeichner mit demselben Namen haben, so dass es eine Mehrdeutigkeit geben kann. (Beispiel: Versuchen Sie, die Speicheradresse von einem von ihnen zu bekommen. Das ist ein Fall, wo eine Mehrdeutigkeit entstehen könnte)
Der Compiler kann den zweiten Fall behandeln, weil der eine ein Typ und der andere ein Bezeichner ist. Da er weiß, wo er einen Typ erwartet und wo er einen Bezeichner erwartet, gibt es keine Mehrdeutigkeit.
Dies ist für die Rückwärtskompatibilität mit C erforderlich (wenn ich mich erinnere, definieren einige UNIX-Header sowohl eine Struktur als auch eine Variable mit demselben Namen).
Sie können zwischen einer Klasse und einer Variablen / Funktion disambiguieren:
%Vor%Aber Sie können nicht zwischen einer Variablen und einer Funktion unterscheiden.
Siehe auch das Buch "Design und Entwicklung von C ++" von Bjarne Stroustrup, §2.8.2.
union
, enum
und struct
(und ich nehme an, auch class
) haben zusammen verschiedene "Name Buckets" (hat nichts mit C ++ - Namespaces zu tun!) aus gewöhnlichen Bezeichnern. Dies wird in C deutlich, da Sie den Namen mit struct
etc. Voranstellen müssen.
Ich habe es nicht für C ++, aber das ist vom C-Standard:
%Vor%Tags und Links c++