1

我对 [namespace.udir]p2 的含义有点困惑。考虑以下程序:

namespace X { int i = 1; }

namespace Y { using namespace X; }

int main() { i = 2; }

在它的i主要名称查找失败(我尝试使用 GCC、Clang 和 Visual c++)。这似乎与 [namespace.udir]p2 ( http://eel.is/c++draft/dcl.dcl#namespace.udir-2 ) 不一致:

using-directive 指定指定命名空间中的名称可以在 using-directive 出现在 using-directive 之后的范围内使用。在非限定名称查找 ([basic.lookup.unqual]) 期间,名称看起来好像它们是在最近的封闭命名空间中声明的,其中包含使用指令和指定命名空间。[注:在此上下文中,“包含”是指“直接或间接包含”。——尾注]

在我的程序中,我将这个规则应用于由ini声明的 name ,方式如下:int i = 1;X

  • 使用指令:using namespace X;

  • 指定的命名空间:X

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

这是否意味着iin的非限定名称查找main应该找到X::i?为什么我尝试的三个编译器都没有得到这个结果?

4

1 回答 1

1

使用指令使名称在它们出现的范围内可见。例如,[basic.scope.namespace]p1

对于每个指定成员命名空间的using 指令,成员的潜在范围包括在成员声明点之后的using 指令的潜在范围部分

其中名称的范围是程序的一部分,可以通过非限定查找找到该名称(该名称的声明) 。

同样,在 [namespace.udir]p2 中,

using-directive指定指定命名空间中的名称可以在using-directive出现在using- directive 之后的范围内使用。

这基本上和上面的引用说的是一样的。

在 OP 中,using 指令出现在命名空间 Y 的命名空间范围内;main在该范围之外,因此using 指令对内部执行的名称查找没有影响main

于 2015-07-18T19:59:12.883 回答