我试图了解为什么该程序没有为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 ++标准解释这种行为?我不明白。
在第一个程序i
中,因为变量using是在命名空间P中定义的,使用过的变量已定义
using namespace X;
将X的声明放置在全局名称空间(X和P的通用名称空间)中。因此i
,P中的声明(由于另一个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的封闭命名空间是命名空间Q。
在第二个程序i
中,由于这两个using指令,它们的两个定义都放置在全局名称空间中
//...
using namespace X;
//...
using namespace P;
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句