In C ++ wird der Operator ::
verwendet, um auf Klassen, Funktionen und Variablen in einem Namespace oder einer Klasse zuzugreifen.
Wenn die Sprachspezifikation .
anstelle von ::
in diesen Fällen auch beim Zugriff auf Instanzvariablen / -methoden eines Objekts verwendet wird, würde dies dann zu möglichen Mehrdeutigkeiten führen, die nicht vorhanden sind ::
?
Da C ++ keine Variablennamen zulässt, die auch ein Typname sind, kann ich mir keinen Fall vorstellen, in dem dies passieren könnte.
Klarstellung: Ich frage nicht, warum ::
ausgewählt wurde .
, nur wenn es auch hätte funktionieren können?
c++
language-design
Jimmy RT
quelle
quelle
Antworten:
Aufgrund der Versuche, C ++ größtenteils mit dem vorhandenen C-Code kompatibel zu machen (der Namenskollisionen zwischen Objektnamen und Struktur-Tags zulässt), ermöglicht C ++ Namenskollisionen zwischen Klassennamen und Objektnamen.
Was bedeutet, dass:
ist legitimer Code.
quelle
.
oder::
zwischen den gleichen zwei „Wörter“ andere Wirkung hat (data.member
bezieht sich auf diemember
von demdata
Objekt der Klassedata2
, währenddata::member
auf das bezieht sichmember
der Klassedata
)?::
man jedoch von C ++ so spricht, wie es ist, und abgesehen davon, warum es so ist, würde es eine Mehrdeutigkeit geben, wenn alle geändert würden.
. In gewisser Weise haben Sie bereits mit Ja geantwortet . Ich kann einfach nicht in Ihren ersten Kommentar einbrechen. Vielleicht lässt mein Level diesen Kommentar für mich rauchig aussehen.Ein Beispiel, bei dem beide gültig sind, sich jedoch auf unterschiedliche Objekte beziehen:
Sehen Sie live auf coliru .
quelle
Es gibt einen Unterschied zwischen
a::b
unda.b
wo::
impliziert, dass diesa
als Namespace verwendet wird, was bedeutet, dass es sich um einen Namespace oder einen Typnamen handelt. Vorausgesetzt, dass C ++ die nicht-virtuelle Pluralvererbung unterstützt und eine Variable denselben Namen wie ein Typ haben kann, verringert dies die Wahrscheinlichkeit, dass auf ein falsches Objekt verwiesen wird. Es ist für die Metaprogrammierung von Vorlagen erforderlich.Ein anderes Beispiel wäre
&B::foo
vs&B.foo
im Kontext der Klasse B.quelle
Lassen Sie @Deduplicator Beispiel erweitern:
Live auf Coliru Viewer
Ohne die Möglichkeit, mit Hilfe von :: zu unterscheiden, auf welches Mitglied wir zugreifen möchten, ist es unmöglich, auf Mitglieder zuzugreifen, die in einer übergeordneten Klasse mit identischen Namen deklariert sind.
quelle
A A
(Variablenname, der auch ein Typname ist) ist in C ++ jedoch nicht gültig, sodass dieses Beispiel derzeit nicht funktioniert