Что означает ведущий :: в «использовании пространства имен :: X» в C ++ - PullRequest
16 голосов
/ 22 июля 2011

Может кто-нибудь объяснить мне разницу между следующим использованием пространства имен:

using namespace ::layer::module;

и

using namespace layer::module;

Что вызывает дополнительные :: перед layer?

Ответы [ 4 ]

24 голосов
/ 22 июля 2011

Было бы различие, если бы оно использовалось в контексте, таком как:

namespace layer {
    namespace module {
        int x;
    }
}

namespace nest {
    namespace layer {
        namespace module {
            int x;
        }
    }
    using namespace /*::*/layer::module;
}

С начальным :: первое x было бы видно после директивы using, без второгоx внутри nest::layer::module станет видимым.

13 голосов
/ 22 июля 2011

Ведущий :: относится к глобальному пространству имен . Любой квалифицированный идентификатор, начинающийся с ::, всегда будет ссылаться на некоторый идентификатор в глобальном пространстве имен. Разница в том, что если у вас есть одно и то же в глобальном и локальном пространствах имен:

namespace layer { namespace module {
    void f();
} }

namespace blah { 
  namespace layer { namespace module {
      void f();
  } }

  using namespace layer::module // note: no leading ::
                                // refers to local namespace layer
  void g() {
    f(); // calls blah::layer::module::f();
  }
}

namespace blubb {
  namespace layer { namespace module {
      void f();
  } }

  using namespace ::layer::module // note: leading ::
                                  // refers to global namespace layer
  void g() {
    f(); // calls ::layer::module::f();
  }
}
13 голосов
/ 22 июля 2011

Второй случай может быть X::layer::module, где using namespace X уже произошло.

В первом случае префикс :: означает «компилятор, не будь умным, начинай с global namespace ".

4 голосов
/ 22 июля 2011

Он называется Поиск квалифицированного имени в C ++.

Это означает, что упоминаемое пространство имен слоя - это одно из глобального пространства имен, а не другое вложенное пространство имен с именем layer.

Для фанатов Standerdese:
$ 3,4,3 / 1

"На имя члена класса или пространства имен можно ссылаться после оператора разрешения области действия (5.1), применяемого к спецификатору вложенного имени, который назначает его класс или пространство имен. Во время поиска имени предшествующие оператору разрешения :: scope, имена объектов, функций и перечислителей игнорируются. Если найденное имя не является class-name (пункт 9) или namespace-name (7.3.1), программа некорректна. "

...