Псевдоним пространства имен может быть также применен к вложенному пространству имен:
namespace Qlib = cplusplus_primer::QueryLib;
Qlib::Query q;
using (напоминание)Имена, представленные в объявлении using, подчиняются обычным правилам области видимости. Имя видимо от точки объявления using и до конца области видимости, в которой оно объявлено. Сущности внутренней области видимости скрывают одноименные сущности внешней. Короткие имена могут использоваться только в той области видимости, в которой они объявлены, а также в областях видимости, вложенных в нее. По завершении области видимости следует использовать полные имена.
Объявление using может присутствовать в глобальной и локальной области видимости, а также в области видимости пространства имен или класса. Объявление using в области видимости класса ограничено именами, определенными в базовом классе определяемого класса (см. раздел 15.5).
usingПодобно объявлению using, using (using directive) позволяет использовать не квалифицированную форму имен. Однако, в отличие от объявления using, здесь не сохраняется контроль над видимостью имен, поскольку все они видимы.
Директива using начинается с ключевого слова using, за которым следует ключевое слово namespace, сопровождаемое именем пространства имен. Если имя пространства не было определено ранее, произойдет ошибка. Директива using может присутствовать в глобальной, локальной области видимости или в пространстве имен. Она не может присутствовать в области видимости класса.
using для таких пространств имен, как std, которые приложение не контролирует, возвращает все проблемы конфликта имени, присущие использованию нескольких библиотек.
using и область видимостиОбласть видимости имен, указанных директивой using, гораздо сложнее, чем в случае объявления using. Объявление using помещает имя непосредственно в ту же область видимости, в которой находится само объявление using. Объявление using подобно локальному псевдониму для члена пространства имен.
Директива using не объявляет локальные псевдонимы для имен членов пространства имен. Вместо этого она поднимает члены пространства имен в ближайшую область видимости, которая содержит и пространство имен, и саму директиву using.
Различие в области видимости между объявлением using и директивой using проистекает непосредственно из принципа действия этих средств. В случае объявления using само имя просто становится доступным в локальной области видимости. Директива using, напротив, делает доступным все содержимое пространства имен. Вообще, пространство имен способно включать определения, которые не могут присутствовать в локальной области видимости. Как следствие, директива using рассматривается как присутствующая в ближайшей области видимости окружающего пространства имен.
Рассмотрим самый простой случай. Предположим, что в глобальной области видимости определено пространство имен А и функция f(). Если функция f() имеет директиву using для пространства имен А, функция f() будет вести себя так, как будто имена пространства имен А присутствовали в глобальной области видимости до определения функции f().
//
//
namespace А {
int i, j;
}
void f() {
using namespace A; //
//
cout << i * j << endl; //
// ...
}
usingРассмотрим следующий пример:
namespace blip {
int i = 16, j = 15, k = 23; //
}
int j = 0; //
void manip() {
//
//
using namespace blip; //
//
++i; //
++j; //