Würde das Ersetzen von ' :: ' durch ' . ' zu Zweideutigkeiten in C++ führen?
In C++ wird der Operator ::
für den Zugriff auf Klassen, Funktionen und Variablen in einem Namespace oder einer Klasse verwendet.
Wenn die Sprachspezifikation auch in diesen Fällen .
anstelle von ::
verwenden würde, z. B. beim Zugriff auf Instanzvariablen/Methoden eines Objekts, würde das zu möglichen Zweideutigkeiten führen, die bei ::
nicht vorhanden sind?
In Anbetracht der Tatsache, dass C++ keine Variablennamen zulässt, die auch ein Typname sind, kann ich mir keinen Fall vorstellen, in dem das passieren könnte.
Klarstellung: Ich frage nicht, warum ::
gegenüber .
gewählt wurde, sondern nur, ob es auch hätte funktionieren können.
75
4
Aufgrund von Versuchen, C++ weitgehend kompatibel mit dem bestehenden C-Code zu machen (der Namenskollisionen zwischen Objektnamen und struct-Tags erlaubt), erlaubt C++ Namenskollisionen zwischen Klassennamen und Objektnamen.
Das bedeutet, dass:
rechtmäßiger Code ist.
Ein Beispiel, bei dem beide gültig sind, sich aber auf unterschiedliche Objekte beziehen:
Es gibt einen Unterschied zwischen
a::b
unda.b
, wobei::
impliziert, dassa
als Namespace verwendet wird, was bedeutet, dass es sich um einen Namespace oder Typename handelt. Unter der Voraussetzung, dass C++ nicht-virtuelle plurale Vererbung unterstützt und dass eine Variable den gleichen Typ haben kann, werden die Chancen, ein falsches Objekt zu referenzieren, verringert. Es ist notwendig für die Template-Metaprogrammierung.Ein weiteres Beispiel wäre
&B::foo
gegenüber&B.foo
im Kontext der Klasse B.Lassen Sie das Beispiel @Deduplicator erweitern: