No C ++, o operador ::
é usado para acessar classes, funções e variáveis em um espaço para nome ou classe.
Se a especificação de linguagem usada em .
vez de ::
nesses casos também gostar ao acessar variáveis / métodos de instância de um objeto, isso causaria possíveis ambiguidades que não estão presentes ::
?
Dado que o C ++ não permite nomes de variáveis que também são um nome de tipo, não consigo pensar em um caso em que isso poderia acontecer.
Esclarecimento: Não estou perguntando por que ::
foi escolhido .
, apenas se poderia ter funcionado também?
c++
language-design
Jimmy RT
fonte
fonte
Respostas:
Devido a tentativas de tornar o C ++ principalmente compatível com o código C existente (que permite colisões de nomes entre nomes de objetos e tags struct), o C ++ permite colisões de nomes entre nomes de classes e nomes de objetos.
O que significa que:
é um código legítimo.
fonte
.
ou::
entre os mesmos dois "palavras" tem efeito diferente (data.member
refere-se àmember
dodata
objeto da classedata2
, ao passo quedata::member
se refere aomember
da classedata
)?::
fossem alterados para.
. De certa forma, você já respondeu sim . Simplesmente não posso violar seu primeiro comentário. Talvez meu nível faça esse comentário parecer esfumaçado para mim.Um exemplo em que ambos são válidos, mas referem-se a objetos diferentes:
Veja ao vivo em coliru .
fonte
Há diferença entre
a::b
ea.b
onde::
implica quea
usado como espaço para nome, o que significa que é espaço para nome ou nome do tipo. Desde que o C ++ ofereça suporte a herança plural não virtual e que uma variável possa ter o mesmo nome que um tipo, isso reduz as chances de fazer referência a objetos incorretos. É necessário para a metaprogramação de modelos.Outro exemplo seria
&B::foo
vs&B.foo
no contexto da classe B.fonte
Vamos estender o exemplo do @Deduplicator:
Ao vivo no Coliru Viewer
Não tendo a possibilidade de diferenciar com a ajuda de ::, qual membro queremos acessar, é impossível acessar membros declarados em uma classe pai com nomes idênticos.
fonte
A A
(nome da variável que também é um nome de tipo) não é válido em C ++, portanto, este exemplo não funciona por enquanto