++::j; //
++blip::j; //
int k = 97; //
++k; //
}
Директива using
в функции manip()
делает все имена пространства имен blip
доступными непосредственно. То есть функция manip()
может обращаться к этим членам, используя краткую форму имен.
Члены пространства имен blip
выглядят так, как будто они были определены в одной области видимости. Если пространство имен blip
определено в глобальной области видимости, его члены будут выглядеть так, как будто они объявлены в глобальной области видимости.
Когда пространство имен вводится в окружающую область видимости, имена в пространстве имен вполне могут вступить в конфликт с другими именами, определенными (включенными) в той же области видимости. Например, в функции manip()
член j
пространства имен blip
вступает в конфликт с глобальным объектом j
. Такие конфликты разрешимы, но для использования имени следует явно указать, какая версия имеется в виду. Любое использование имени j
в пределах функции manip()
ведет к неоднозначности.
Чтобы использовать такое имя, как j
, следует применить оператор области видимости, позволяющий указать требуемое имя. Для указания переменной j
, определенной в глобальной области видимости, нужно написать ::j
, а для определенной в пространстве имен blip
— blip::j
.
Поскольку имена находятся в разных областях видимости, локальные объявления в пределах функции manip()
могут скрыть некоторые из имен пространства имен. Локальная переменная k
скрывает член пространства имен blip::k
. Обращение к переменной k
в пределах функции manip()
вполне однозначно, это обращение к локальной переменной k
.
using
или директивыЗаголовок, содержащий директиву или объявление using
в своей области видимости верхнего уровня, вводит свои имена в каждый файл, который подключает заголовок. Обычно заголовки должны определять только те имена, которые являются частью его интерфейса, но не имена, используемые в его реализации. В результате файлы заголовка не должны содержать директив или объявлений using
, кроме как в функциях или пространствах имен (см. раздел 3.1).