Substituiria ' :: ' por ' . ' criar ambiguidades em C++?

Em C++, o operador :: é utilizado para aceder a classes, funções e variáveis num namespace ou numa classe.

Se a especificação da linguagem utilizada . em vez de :: nos casos em que também se acede a variáveis/métodos de instância de um objecto, isso causaria possíveis ambiguidades que estão't presentes com ::?

Dado que C++ não't permite nomes de variáveis que são também um nome de tipo, posso't pensar num caso em que isso poderia acontecer.

Esclarecimento: I'não estou a perguntar porquê :: foi escolhido em vez de ., só se também podia ter funcionado?

Comentários sobre a pergunta (1)
Solução

Devido a tentativas de tornar C++ na sua maioria compatível com o código C existente (que permite colisões de nomes entre nomes de objectos e etiquetas estruturais), C++ permite colisões de nomes entre nomes de classes e nomes de objectos.

O que significa que:

struct data {
    static int member;
};

struct data2 {
    int member;
};

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

é um código legítimo.

Comentários (6)

Um exemplo em que ambos são válidos, mas referem-se a objectos diferentes:


#incluir 

estrutura A {
    int i;
};

estrutura B {
    int i;
    A B;
};

int principal() {
    B x {0, 1};
    std::cout 
Comentários (1)

Há diferença entre a::b' ea.b' onde :: implica que `a' seja utilizado como espaço de nomes, o que significa que é espaço de nomes ou nome tipográfico. Desde que C++ suporte herança plural não-virtual e que uma variável possa ter o mesmo que o tipo, esta tiras as hipóteses de referenciar objectos errados. It's necessário para metaprogramação de modelos.

Outro exemplo seria &B::foo vs &B.foo no contexto da classe B.

Comentários (0)

Vamos alargar @Deduplicator exemplo:


#incluir 

estrutura A {
    int i;
};

estrutura B : público A {
    int i;
    A A;
};

int main() {) {
    B x {1, 2};
    std::cout 
Comentários (2)