看看这个片段:
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放入命名空间(删除两个//),代码将编译.这是为什么?全局命名空间有什么特别之处?
引用标准:
using 指令指定指定命名空间中的名称可以在 using 指令出现在 using 指令之后的范围内使用。在非限定名称查找 (3.4.1) 期间,名称看起来好像是在最近的封闭名称空间中声明的,该名称空间包含 using 指令和指定名称空间。
看看这段代码:
namespace A {
int fn() { return 1; }
}
namespace Inner {
int fn() { return 2; }
namespace B {
using namespace A;
int z = fn();
}
}
Run Code Online (Sandbox Code Playgroud)
在这里,在我知道命名空间的确切规则之前,我曾期望z将其初始化为 1,正如我所写的那样using namespace A,因此预计A::fn()将使用它。但事实并非如此,z将被初始化为2,Inner::fn()因为我引用的规则而被称为。
这种行为背后的基本原理是什么:“好像它们是在最近的包含 using 指令和指定命名空间的封闭命名空间中声明的”?
如果using namespace为该命名空间中的所有内容应用 using 声明,会有什么缺点?
注意:这是促使我提出这个问题的相关问题。