может кто-нибудь объяснить мне разницу между следующими использованиями пространства имен:
using namespace ::layer::module;
и
using namespace layer::module;
Что вызывает дополнительный ::
до layer
?
может кто-нибудь объяснить мне разницу между следующими использованиями пространства имен:
using namespace ::layer::module;
и
using namespace layer::module;
Что вызывает дополнительный ::
до layer
?
Было бы различие, если бы оно использовалось в контексте, например:
namespace layer {
namespace module {
int x;
}
}
namespace nest {
namespace layer {
namespace module {
int x;
}
}
using namespace /*::*/layer::module;
}
С начальным ::
первый x
будет виден после директивы use, без него будет сделана видимая вторая x
внутри nest::layer::module
.
Второй случай может быть X::layer::module
, где using namespace X
уже произошло.
В первом случае префикс ::
означает "компилятор, не умник, начинайте с глобального пространства имен".
Ведущий ::
относится к глобальному пространству имен. Любой квалифицированный идентификатор, начинающийся с ::
, всегда будет ссылаться на некоторый идентификатор в глобальном пространстве имен. Разница заключается в том, что у вас есть один и тот же материал в глобальном, а также в каком-то локальном пространстве имен:
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();
}
}
Он называется проверенным поиском имен на С++.
Это означает, что упомянутое пространство имен слоев относится к одному из глобального пространства имен, а не к другому вложенному пространству имен с именем layer.
Для поклонников Standerdese:
$3.4.3/1
"Имя элемента класса или пространства имен можно передать после оператора (5.1) разрешения области видимости, применяемого к вложенному имени-спецификатору, который назначает свой класс или пространство имен. Во время поиска имени, предшествующего:: оператор разрешения области, объект, функция и имена перечислителей игнорируются. Если найденное имя не является именем класса (раздел 9) или именем пространства имен (7.3.1), программа плохо сформирована."