En C ++, l'opérateur ::
est utilisé pour accéder aux classes, fonctions et variables dans un espace de noms ou une classe.
Si la spécification de langage utilisée .
au lieu de ::
dans ces cas aussi, comme lors de l'accès aux variables / méthodes d'instance d'un objet, cela provoquerait-il des ambiguïtés possibles qui ne sont pas présentes ::
?
Étant donné que C ++ n'autorise pas les noms de variables qui sont également un nom de type, je ne peux pas penser à un cas où cela pourrait se produire.
Clarification: je ne demande pas pourquoi a ::
été choisi .
, juste si cela aurait pu fonctionner aussi?
c++
language-design
Jimmy RT
la source
la source
Réponses:
En raison des tentatives de rendre C ++ principalement compatible avec le code C existant (qui permet les collisions de noms entre les noms d'objets et les balises struct), C ++ permet les collisions de noms entre les noms de classe et les noms d'objets.
Ce qui signifie que:
est un code légitime.
la source
.
ou::
entre les deux mêmes "mots" a un effet différent (sedata.member
réfère àmember
l'data
objet de la classedata2
, alors qu'il sedata::member
réfère à lamember
de la classedata
)?::
était changé en.
. D'une certaine manière, vous avez déjà répondu oui . Je ne peux tout simplement pas percer votre premier commentaire. Peut-être que mon niveau fait que ce commentaire me semble enfumé.Un exemple où les deux sont valides, mais font référence à des objets différents:
Voir en direct sur coliru .
la source
Il existe une différence entre
a::b
eta.b
où::
implique celuia
utilisé comme espace de noms, ce qui signifie qu'il s'agit d'un espace de noms ou d'un nom de type. À condition que C ++ prenne en charge l'héritage pluriel non virtuel et qu'une variable puisse avoir le même nom qu'un type, cela supprime les chances de référencer un mauvais objet. Il est nécessaire pour la métaprogrammation des modèles.Un autre exemple serait
&B::foo
vs&B.foo
dans le contexte de la classe B.la source
Prenons l'exemple de @Deduplicator:
En direct sur Coliru Viewer
N'ayant pas la possibilité de différencier à l'aide de ::, le membre auquel nous voulons accéder, il est impossible d'accéder aux membres déclarés dans une classe parente avec des noms identiques.
la source
A A
(le nom de variable qui est également un nom de type) n'est cependant pas valide en C ++, donc cet exemple ne fonctionne pas pour l'instant