如何解释c ++标准中的规则[namespace.udir] p2?

时间:2015-07-18 19:43:36

标签: c++ language-lawyer using-directives name-lookup

我对[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

  • 最近的封闭命名空间:全局命名空间

这是否意味着mainX::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 } ?为什么我没有用我试过的三个编译器中的任何一个得到这个结果?

1 个答案:

答案 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内执行的名称查找没有影响。