Beaucoup de réponses raisonnables déjà. Je vais apporter une analogie qui pourrait aider certains lecteurs. ::
fonctionne un peu comme le séparateur de répertoires du système de fichiers ' /
', lorsque vous recherchez dans votre chemin un programme que vous souhaitez exécuter. Considérer:
/path/to/executable
Ceci est très explicite - seul un exécutable à cet emplacement exact dans l'arborescence du système de fichiers peut correspondre à cette spécification, quel que soit le PATH en vigueur. De même...
::std::cout
... est également explicite dans "l'arborescence" de l'espace de noms C ++.
Contrairement à ces chemins absolus, vous pouvez configurer de bons shells UNIX (par exemple zsh ) pour résoudre les chemins relatifs sous votre répertoire actuel ou n'importe quel élément de votre PATH
variable d'environnement, donc si PATH=/usr/bin:/usr/local/bin
, et vous étiez "dans" /tmp
, alors ...
X11/xterm
... courrait avec plaisir /tmp/X11/xterm
s'il était trouvé, sinon /usr/bin/X11/xterm
, sinon /usr/local/bin/X11/xterm
. De même, supposons que vous vous trouviez dans un espace de noms appelé X
, et que vous aviez un " using namespace Y
" en vigueur, alors ...
std::cout
... pourrait être trouvé dans l' un des ::X::std::cout
, ::std::cout
, ::Y::std::cout
et éventuellement d' autres endroits en raison de recherche dépendant de l' argument (ADL, alias Koenig recherche). Donc, seul ::std::cout
est vraiment explicite exactement l'objet que vous voulez dire, mais heureusement, personne sensé ne créerait jamais sa propre classe / structure ou espace de noms appelé " std
", ni quoi que ce soit appelé " cout
", donc en pratique, utiliser std::cout
est très bien.
Différences notables :
1) les shells ont tendance à utiliser la première correspondance en utilisant l'ordre dans PATH
, tandis que C ++ donne une erreur de compilation lorsque vous avez été ambigu.
2) En C ++, les noms sans portée principale peuvent être mis en correspondance dans l'espace de noms actuel, tandis que la plupart des shells UNIX ne le font que si vous les mettez .
dans le PATH
.
3) C ++ recherche toujours l'espace de noms global (comme avoir /
implicitement votre PATH
).
Discussion générale sur les espaces de noms et l'explicitation des symboles
L'utilisation de ::abc::def::...
"chemins" absolus peut parfois être utile pour vous isoler de tout autre espace de noms que vous utilisez, qui fait partie, mais n'a pas vraiment de contrôle sur le contenu, ni même d'autres bibliothèques que le code client de votre bibliothèque utilise également. D'autre part, il vous couple également plus étroitement à l'emplacement "absolu" existant du symbole, et vous manquez les avantages de la correspondance implicite dans les espaces de noms: moins de couplage, mobilité plus facile du code entre les espaces de noms et code source plus concis et lisible .
Comme pour beaucoup de choses, c'est un équilibre. Les C ++ standard puts beaucoup d'identificateurs sous std::
qui sont moins « unique » que cout
, que les programmeurs peuvent utiliser pour quelque chose de complètement différent dans leur code (par exemple merge
, includes
, fill
, generate
, exchange
, queue
, toupper
, max
). Deux bibliothèques non standard non apparentées ont beaucoup plus de chances d'utiliser les mêmes identifiants car les auteurs ne se connaissent généralement pas ou moins. Et les bibliothèques - y compris la bibliothèque C ++ Standard - changent leurs symboles au fil du temps. Tout cela crée potentiellement une ambiguïté lors de la recompilation de l'ancien code, en particulier lorsqu'il y a eu une utilisation intensive de using namespace
s: la pire chose que vous puissiez faire dans cet espace est de permettreusing namespace
s dans les en-têtes pour échapper à la portée des en-têtes, de sorte qu'une quantité arbitrairement importante de code client direct et indirect ne peut pas prendre ses propres décisions concernant les espaces de noms à utiliser et comment gérer les ambiguïtés.
Ainsi, un leader ::
est un outil dans la boîte à outils du programmeur C ++ pour lever activement l'ambiguïté d'un conflit connu et / ou éliminer la possibilité d'une ambiguïté future ...
::
moyens nus référencent la variable de l'espace de noms global / anonyme.