En C ++, el operador ::se utiliza para acceder a clases, funciones y variables en un espacio de nombres o clase.
Si la especificación de lenguaje utilizada en .lugar de ::en esos casos también es como cuando se accede a las variables / métodos de instancia de un objeto, ¿eso causaría posibles ambigüedades que no están presentes ::?
Dado que C ++ no permite nombres de variables que también son un nombre de tipo, no puedo pensar en un caso en el que eso pueda suceder.
Aclaración: no estoy preguntando por qué ::se eligió ., sino si también podría haber funcionado.
c++
language-design
Jimmy RT
fuente
fuente

Respuestas:
Debido a los intentos de hacer que C ++ sea principalmente compatible con el código C existente (que permite colisiones de nombres entre nombres de objetos y etiquetas de estructura), C ++ permite colisiones de nombres entre nombres de clase y nombres de objetos.
Lo que significa que:
Es un código legítimo.
fuente
.o::entre los mismos dos "palabras" tiene efecto diferente (data.memberse refiere a lamemberdeldataobjeto de la clasedata2, mientras quedata::memberse refiere a lamemberde la clasedata)?::se cambiaran a.. En cierto modo ya respondiste que sí . Simplemente no puedo entrar en tu primer comentario. Tal vez mi nivel hace que ese comentario me parezca lleno de humo.Un ejemplo donde ambos son válidos, pero se refieren a diferentes objetos:
Ver en vivo en coliru .
fuente
Hay una diferencia entre
a::bya.bdonde::implica que seausa como espacio de nombres, lo que significa que es un espacio de nombres o nombre de tipo. Siempre que C ++ admita la herencia plural no virtual y que una variable pueda tener el mismo nombre que un tipo, esto elimina las posibilidades de hacer referencia a un objeto incorrecto. Es necesario para la metaprogramación de plantillas.Otro ejemplo sería
&B::foovs&B.fooen el contexto de la clase B.fuente
Dejemos extender @Deduplicator ejemplo:
Live on Coliru Viewer
Al no tener la posibilidad de diferenciar con ayuda de ::, a qué miembro queremos acceder, es imposible acceder a los miembros declarados en una clase principal con nombres idénticos.
fuente
A A(nombre de variable que también es un nombre de tipo) no es válido en C ++, por lo que este ejemplo no funciona por ahora