Подтвердить что ты не робот

Что означает листинг:: mean в "использовании пространства имен:: X" в С++

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

using namespace ::layer::module;

и

using namespace layer::module;

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

4b9b3361

Ответ 1

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

namespace layer {
    namespace module {
        int x;
    }
}

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

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

Ответ 2

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

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

Ответ 3

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

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();
  }
}

Ответ 4

Он называется проверенным поиском имен на С++.

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

Для поклонников Standerdese:
$3.4.3/1

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