【发布时间】:2017-07-04 18:36:52
【问题描述】:
引用标准:
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();
}
}
在这里,在我知道命名空间的确切规则之前,我曾预计z 将被初始化为1,因为我写了using namespace A,因此预计将使用A::fn()。但事实并非如此,z 将被初始化为 2,因为 Inner::fn() 被调用是因为我引用的规则。
这种行为背后的基本原理是什么:“好像它们是在最近的封闭命名空间中声明的,其中包含使用指令和指定命名空间”?
如果using namespace 用作对该命名空间中的所有内容应用 using 声明,会有什么缺点?
注意:this 是促使我提出这个问题的相关问题。
【问题讨论】:
-
这对我来说似乎也违反直觉,但它似乎从 C++98 开始就是这样。
标签: c++ namespaces language-lawyer