
using 指示符使名字空间成员名可见就好像它们是在名字空间被定义的地方之外被声明的一样例如由于using 指示符名字空间cplusplus_primer 的成员就好像是在全局域中func()定义之前声明的一样using 指示符并没有为名字空间成员的名字声明局部的别名而是把名字空间的成员转移到包含该名字空间定义的那个域中比如如下代码
namespace A {
int i, j;
}
对域中有如下using 声明的代码来说
using namespace A;
看起来就像
int i, j;
我们来看个例子它说明了using 声明的影响它保留了该名字空间域但是将成员名与
一个局部同义词相关联以及using 指示符的影响其效果相当于去掉了该名字空间
namespace blip {
int bi = 16, bj = 15, bk = 23;
// 其他声明
}
int bj = 0;
void manip() {
using namespace blip; // using 指示符 -
// ::bj 和 blip::bj 之间的冲突只在bj 被使用时才被检测到
++bi; // 设置 blip::bi 为 17
++bj; // 错误: 二义性
// 全局 bj 还是 blip::bj?
++::bj; // ok: 设置全局 bj 为 1
++blip::bj; // ok: 设置 blip::bj 为 16
int bk = 97; // 局部 bk 隐藏 blip::bk
++bk; // 设置局部 bk 为 98
}
标准C++库中的所有组件都是在一个被称为std 的名字空间中声明和定义的在标准头
文件如<vector>或<iostream> 中声明的函数对象和类模板都被声明在名字空间std 中