提问人:Supremum 提问时间:7/19/2015 更新时间:7/19/2015 访问量:55
如何解释 c++ 标准中的规则 [namespace.udir]p2?
How to interpret the rule [namespace.udir]p2 in the c++ standard?
问:
我对 [namespace.udir]p2 的含义有点困惑。请考虑以下程序:
namespace X { int i = 1; }
namespace Y { using namespace X; }
int main() { i = 2; }
在其中,main的名称查找失败了(我尝试了GCC,Clang和visual c ++)。这似乎与 [namespace.udir]p2 (http://eel.is/c++draft/dcl.dcl#namespace.udir-2) 不一致:i
using 指令指定指定命名空间中的名称 可以在 using 指令出现在 之后的作用域中使用 using 指令。在非限定名称查找期间 ([basic.lookup.unqual]),名称看起来就像是在 最接近的封闭命名空间,其中包含 using-指令和指定的命名空间。[注:在此背景下, “包含”是指“直接或间接包含”。——尾注 ]
在我的程序中,我通过以下方式将此规则应用于名称 ,由 声明:i
int i = 1;
X
using 指令:
using namespace X;
指定的命名空间:
X
最接近的封闭命名空间:全局命名空间
这难道不是说 in 的不限定名称查找应该找到吗?为什么我尝试过的三个编译器中的任何一个都没有得到这个结果?i
main
X::i
答:
using 指令使名称在它们出现的范围内可见。例如,[basic.scope.namespace]p1
对于指定成员命名空间的每个 using 指令,成员的潜在作用域包括成员声明点之后的 using 指令潜在作用域的那部分
其中名称的作用域是程序的一部分,可以通过非限定查找找到该名称(该名称的声明)。
同样,在 [namespace.udir]p2 中,
using 指令指定指定命名空间中的名称可以在 using 指令出现在 using 指令之后的作用域中使用。
这基本上与上面的报价相同。
在 OP 中,using 指令出现在命名空间 Y 的 namespace-scope 中; 超出了该范围,因此 using 指令对 中执行的名称查找没有影响。main
main
评论