我对[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-directive指定指定名称空间中的名称 可以在using指令出现的范围内使用 使用指令。在不合格的名称查找期间 ([basic.lookup.unqual]),名称显示为声明它们 包含两者的最近的封闭命名空间 using-directive和指定的命名空间。 [注意:在这种情况下, “包含”表示“直接或间接包含”。 - 结束说明]
通过我的计划,我将i
int i = 1;
在X
中声明的名称using namespace X;
应用此规则,方法如下:
using-directive:X
指定的命名空间:i
最近的封闭命名空间:全局命名空间
这是否意味着main
中X::i
的{{1}}的无限制名称查找应该找到 var forms = document.querySelectorAll('form');
for (var i = 0; i < forms.length; i++) {
forms[i].style.width = 250 + 'px';//sets the width of all forms to 250px
}
?为什么我没有用我试过的三个编译器中的任何一个得到这个结果?
答案 0 :(得分:1)
使用-directives使名称在出现的范围内可见。例如,[basic.scope.namespace] p1
对于指定成员名称空间的每个 using-directive ,成员的潜在范围包括 using-directive 的潜在范围的一部分,该部分遵循成员的要点声明
其中名称的范围是程序的一部分,其中该名称(该名称的声明)可以通过非限定查找找到。
同样,在[namespace.udir] p2中,
using-directive 指定指定命名空间中的名称可用于 using-directive 出现在 using-directive之后的范围内
基本上与上面引用的内容相同。
在OP中, using-directive 出现在命名空间Y的命名空间范围内; main
超出了该范围,因此 using-directive 对main
内执行的名称查找没有影响。