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.

Kommentare zu der Frage (1)
Lösung

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:

struct data {
    static int member;
};

struct data2 {
    int member;
};

void f(data2& data) {
    data.member = data::member;
}

rechtmäßiger Code ist.

Kommentare (6)

Ein Beispiel, bei dem beide gültig sind, sich aber auf unterschiedliche Objekte beziehen:


#include 

struct A {
    int i;
};

struct B {
    int i;
    A B;
};

int main() {
    B x {0, 1};
    std::cout 
Kommentare (1)

Es gibt einen Unterschied zwischen a::b und a.b, wobei :: impliziert, dass a 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.

Kommentare (0)

Lassen Sie das Beispiel @Deduplicator erweitern:


#einschließen 

Struktur A {
    int i;
};

Struktur B : öffentlich A {
    int i;
    A A;
};

int main() {
    B x {1, 2};
    std::cout 
Kommentare (2)