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

How to interpret the rule [namespace.udir]p2 in the c++ standard?

提问人:Supremum 提问时间:7/19/2015 更新时间:7/19/2015 访问量:55

问:

我对 [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-指令和指定的命名空间。[注:在此背景下, “包含”是指“直接或间接包含”。——尾注 ]

在我的程序中,我通过以下方式将此规则应用于名称 ,由 声明:iint i = 1;X

  • using 指令:using namespace X;

  • 指定的命名空间:X

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

这难道不是说 in 的不限定名称查找应该找到吗?为什么我尝试过的三个编译器中的任何一个都没有得到这个结果?imainX::i

C++ 语言律师 using-directives 名称查找

评论

2赞 dyp 7/19/2015
“名称看起来好像是声明的”仅适用于 Y 中的不限定查找。这就是第一句话所说的,“指定命名空间中的名称可以在 using 指令出现的范围内使用”

答:

1赞 dyp 7/19/2015 #1

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

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

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

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

using 指令指定指定命名空间中的名称可以在 using 指令出现在 using 指令之后的作用域中使用。

这基本上与上面的报价相同。

在 OP 中,using 指令出现在命名空间 Y 的 namespace-scope 中; 超出了该范围,因此 using 指令对 中执行的名称查找没有影响。mainmain

评论

1赞 dyp 7/19/2015
不幸的是,“范围”一词在这里以两种不同的方式使用;名称的作用域(如我的回答中所定义)和命名空间作用域(程序中可以声明具有命名空间作用域的名称的部分;但指的是单个命名空间)。
0赞 Supremum 7/19/2015
是的,该标准有时会将范围与声明性区域混淆。这有一个 c++ 标准核心语言问题。请参见:stackoverflow.com/questions/23630201/...