我在考虑这么一个问题:
namespace A
{
namespace A1
{
int a = 1;
}
namespace A2
{
void doIt()
{
cout << A1::a << endl;
}
}
}
A, A1, A2 都是命名空间。A::A2::doIt() 要引用 A::A1::a,该如何写。
我查《C++ Primer》没有找到答案。
通过测试,得出这么一个规则,以 doIt() 引用 A::A1::a 为例。可以如此引用:A1::a。
编译器首先在本作用域找有没有 A1::a,即 A::A2::doIt()
如果没有找到,则再找更外围一层去找,即 A::A2,发现也没办法匹配 A1::a。
它再到更外一层去找,即 A,A下面可以找到A1::a。
完成引用。
那么有另一个问题:如果存在 A::A2::A1::a 那怎么办?按我们刚刚的查找规则,是不是优先使用 A::A2::A1::a 呢?
试试看:
namespace A
{
namespace A1
{
int a = 1;
}
namespace A2
{
namesapce A1
{
int a = 2;
}
void doIt()
{
cout << A1::a << endl;
}
}
}
实验证明,它优先使用了 A::A2::A1::a 。
另一个需要提及一下。如果是这样:
namespace A
{
namespace A1
{
int a = 1;
}
namespace A2
{
namesapce A1
{
// int a = 2;
}
void doIt()
{
cout << A1::a << endl;
}
}
}
刻意屏蔽 A::A2::A1::a,那么就编译不过。
说明,编译器在为 A::A2::doIt() 找 A1::a 的时候,的逻辑是:
编译器首先在本作用域找有没有 A1 区域,即 A::A2::doIt() 函数内部。
如果没有找到,则再找更外围一层去找,即 A::A2,发现找到了 A1。
它就进入 A::A2::A1 中,进一步去找这个区域里是否有 a。如果没有,则报错。
编译器并没有再向上进行尝试。