我试图理解为什么这个程序没有给i的名字查找含糊不清:
namespace X { int i = 1; }
namespace Q {
namespace P {
int i = 2;
using namespace X;
}
using namespace P;
int l = i;
}
int main() {}
如果我们像这样修改它,我们会得到一个名称查找模糊:
namespace X { int i = 1; }
namespace P {
int i = 2;
using namespace X;
}
using namespace P;
int l = i;
int main() {}
我在这里做的唯一更改是删除命名空间Q并将其内容放在全局命名空间中。
我尝试了3种不同的编译器:
所有人都会在此电子邮件中说明结果,并且我试图找出原因。
任何人都可以用c ++标准来解释这种行为吗?我不明白。
答案 0 :(得分:1)
在第一个程序中,变量i
在名称空间P中定义,因为using指令
using namespace X;
在全局命名空间中放置X的声明(X和P的通用名称)。因此,P中i
的声明(更确切地说,由于另一个using指令而在Q中)声明了X::i
在全局命名空间中的声明。
来自C ++标准(3.4.1非限定名称查找)
2由using-directive提名的名称空间的声明 在包含using-directive的命名空间中变得可见;看到 7.3.4。
所以我们有第一个程序
namespace X { int i = 1; }
namespace Q {
namespace P {
int i = 2;
using namespace X; // 1
}
using namespace P; // 2
int l = i;
}
使用指令#1的封闭命名空间是全局命名空间,使用指令#2的封闭命名空间是namepsace Q.
在第二个程序中,由于这两个using指令,i
的两个定义都放在全局命名空间中
//...
using namespace X;
//...
using namespace P;