Уже много разумных ответов. Я приведу аналогию, которая может помочь некоторым читателям. ::
во многом похож на разделитель каталогов файловой системы '/
' при поиске программы, которую вы хотите запустить. Рассмотреть возможность:
/path/to/executable
Это очень ясно - только исполняемый файл в этом точном месте в дереве файловой системы может соответствовать этой спецификации, независимо от действующего PATH. Сходным образом...
::std::cout
... в равной степени явным образом присутствует в "дереве" пространства имен C ++.
В отличие от таких абсолютных путей, вы можете настроить хорошие оболочки UNIX (например, zsh) для разрешения относительных em > пути в вашем текущем каталоге или любом элементе в вашей переменной среды PATH
, поэтому, если PATH=/usr/bin:/usr/local/bin
, и вы были "в" /tmp
, то ...
X11/xterm
... с радостью запустит /tmp/X11/xterm
, если найдет, иначе /usr/bin/X11/xterm
, иначе /usr/local/bin/X11/xterm
. Точно так же предположим, что вы находитесь в пространстве имен с именем X
, и у вас действует "using namespace Y
", тогда ...
std::cout
... можно найти в любом из ::X::std::cout
, ::std::cout
, ::Y::std::cout
и, возможно, в других местах из-за поиск, зависящий от аргументов (ADL, также известный как поиск по Кенигу). Таким образом, только ::std::cout
действительно четко определяет, какой именно объект вы имеете в виду, но, к счастью, никто в здравом уме никогда не создаст свой собственный класс / структуру или пространство имен под названием «std
» или что-либо под названием «cout
», поэтому на практике использование только std::cout
является отлично.
Заслуживающие внимания различия:
1) оболочки, как правило, используют первое совпадение с использованием порядка PATH
, тогда как C ++ выдает ошибку компилятора, когда вы неясны.
2) В C ++ имена без какой-либо ведущей области могут быть сопоставлены в текущем пространстве имен, в то время как большинство оболочек UNIX делают это только в том случае, если вы помещаете .
в PATH
.
3) C ++ всегда ищет в глобальном пространстве имен (например, /
неявно имеет PATH
).
Общее обсуждение пространств имен и явности символов
Использование абсолютных ::abc::def::...
"путей" иногда может быть полезно для изоляции вас от любых других используемых вами пространств имен, которые являются частью, но на самом деле не имеют контроля над содержимым, или даже других библиотек, которые также использует клиентский код вашей библиотеки. С другой стороны, он также более тесно связывает вас с существующим «абсолютным» местоположением символа, и вы упускаете преимущества неявного сопоставления в пространствах имен: меньшее связывание, более легкая мобильность кода между пространствами имен и более сжатый, читаемый исходный код. .
Как и во многих других вещах, это баланс. Стандарт C ++ помещает в std::
множество идентификаторов, которые менее «уникальны», чем cout
, которые программисты могут использовать для чего-то совершенно другого в своем коде (например, merge
, includes
, fill
, generate
, exchange
, queue
, toupper
, max
). Две несвязанные нестандартные библиотеки имеют гораздо больше шансов использовать одни и те же идентификаторы, поскольку авторы, как правило, не знают друг друга или не знают друг друга. А библиотеки, включая стандартную библиотеку C ++, со временем меняют свои символы. Все это потенциально создает двусмысленность при перекомпиляции старого кода, особенно при интенсивном использовании using namespace
s: худшее, что вы можете сделать в этом пространстве, - разрешить using namespace
в заголовках выйти за пределы области заголовков, так что произвольно большое количество прямых и косвенных клиентский код не может принимать собственные решения о том, какие пространства имен использовать и как управлять неоднозначностями.
Итак, ведущий ::
- это один из инструментов в наборе инструментов программиста C ++ для активного устранения неоднозначности известного конфликта и / или устранения возможности неоднозначности в будущем ...
person
Tony Delroy
schedule
24.11.2010
::
означает ссылку на переменную из глобального / анонимного пространства имен. - person wkl   schedule 24.11.2010