1 using 声明
using 声明的作用域等同于本条using声明语句所在的作用域
从效果上看就好像using声明语句为命名空间的成员在当前作用域中创建了一个别名一样” ——《C++ primer》5th
int i = 1;
namespace NS
{
int i = 2;
}
void f()
{
cout << i << endl; //输出1,指的是全局作用域中定义的i
using N::i; //从该语句开始的当前作用域中,所有 i 指的均是 NS::i
cout << i << endl; //输出2
int i = 3; //错误,重定义i
}
2 using 指示
A using directive does not declare local aliases. Rather, it has the effect of lifting
the namespace members into the nearest scope that contains both the namespace
itself and the using directive 《C++ Primer》 5th
英文版的描述感觉更清楚一些,也就是说using指示会将这个namespace内的所有成员的作用域(可见性)提升到一个具有如下特点的作用域中:
这个作用域范围必须是能够包含住 <namespace定义本身所在的作用域,以及using语句所在作用域> 的最近的公共父作用域
格式: using namespace + space name
namespace NS1
{
namespace NS2 //命名空间本身的作用域为 NS1
{
int i = 2;
}
namespace NS3
{
namespace NS4
{
void f()
{
using namespace NS2; //using 指示的作用域是 f()函数体
cout << i << endl;
int i= 3;// 正确,这里的i指的是f中的局部变量i
}
}
}
}
//using 指示的作用域是f()函数体, 它所指示的命名空间是NS2,NS2的作用域是NS1, NS2和f()的最近共同
//作用域是NS1, 所以应用using指示后,NS2中的所有成员就好像定义在NS1中一样
也就是说 using指示的作用域是using指示这条语句本身所在的作用域(f())和它所指示的命名空间(NS2)的作用域的最近公共作用域(NS1)