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.member
se refiere a lamember
deldata
objeto de la clasedata2
, mientras quedata::member
se refiere a lamember
de 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::b
ya.b
donde::
implica que sea
usa 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::foo
vs&B.foo
en 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