【发布时间】:2015-07-18 19:43:35
【问题描述】:
我对 [namespace.udir]p2 的含义有点困惑。考虑以下程序:
namespace X { int i = 1; }
namespace Y { using namespace X; }
int main() { i = 2; }
在 main 中查找 i 的名称失败(我尝试使用 GCC、Clang 和 Visual c++)。这似乎与 [namespace.udir]p2 (http://eel.is/c++draft/dcl.dcl#namespace.udir-2) 不一致:
using 指令指定指定命名空间中的名称 可以在 using 指令出现的范围内使用 使用指令。在不合格名称查找期间 ([basic.lookup.unqual]),名称看起来好像它们是在 最近的封闭命名空间,其中包含 using-directive 和指定的命名空间。 [注意:在这种情况下, “包含”是指“直接或间接包含”。 ——尾注]
在我的程序中,我将这条规则应用于名称 i,由 int i = 1; 在 X 中声明,方式如下:
使用指令:
using namespace X;指定的命名空间:
X最近的封闭命名空间:全局命名空间
这不是暗示i 在main 中的非限定名称查找应该找到X::i?为什么我尝试的三个编译器都没有得到这个结果?
【问题讨论】:
-
"名称看起来好像它们已被声明" 仅适用于 Y 内的非限定查找。这就是第一句所说的,"names in the named namespaces可以在using-directive出现的范围内使用"
标签: c++ language-lawyer using-directives name-lookup