请看这个片段:
namespace A {
int fn();
}
namespace B {
int fn();
}
// namespace Ns {
using namespace A;
using namespace B;
using A::fn;
int z = fn();
// }
此代码无法编译,fn()
int z = fn();
不明确
如果我将using
&{39}和z
放入命名空间(删除两个//
),代码就会编译。这是为什么?全局命名空间有什么特别之处?
答案 0 :(得分:8)
见[namespace.udir] / 2
using-directive 指定指定命名空间中的名称可以在范围内使用 using-directive 出现在 using-directive 之后。在非限定名称查找(3.4.1)期间,将显示名称 好像它们是在最近的封闭命名空间中声明的,它包含 using-directive 和 提名命名空间。
因此,当您拥有名称空间Ns
时,指令using namespace A;
和using namespace B
会使A::fn
和B::fn
出现在全局名称空间中,而{{{ 1}}使using A::fn;
出现在fn
中。后一个声明在名称查找期间“胜出”。