使用声明解决歧义

gez*_*eza 7 c++

看看这个片段:

namespace A {
int fn();
}
namespace B {
int fn();
}

// namespace Ns {

using namespace A;
using namespace B;
using A::fn;

int z = fn();

// }
Run Code Online (Sandbox Code Playgroud)

这段代码不能编译,因为fn()它不明确int z = fn();

如果我将using's并z放入命名空间(删除两个//),代码将编译.这是为什么?全局命名空间有什么特别之处?

Bri*_*ian 8

见[namespace.udir]/2

一个using指令规定,在被提名的命名空间中的名字可以在该范围内使用 using指令后出现using指令.在非限定名称查找(3.4.1)期间,名称看起来好像是在最近的封闭命名空间中声明的,其中包含using-directive和指定的命名空间.

因此,当你拥有的命名空间Ns中,指令using namespace A;using namespace BA::fnB::fn出现在全局命名空间,而using A::fn;品牌fn出现Ns.后者声明在名称查找期间"获胜".

  • 实际上,这也是全局命名空间不是特殊的(对于OP来说是明确的):你可以通过在整个文件周围放置一个`namespace Foo {...}`来做到这一点,制作`A`和` B`嵌套命名空间.行为不会改变. (2认同)