【问题标题】:How to interpret the rule [namespace.udir]p2 in the c++ standard?如何解释 c++ 标准中的规则 [namespace.udir]p2?
【发布时间】:2015-07-18 19:43:35
【问题描述】:

我对 [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 指令指定指定命名空间中的名称 可以在 using 指令出现的范围内使用 使用指令。在不合格名称查找期间 ([basic.lookup.unqual]),名称看起来好像它们是在 最近的封闭命名空间,其中包含 using-directive 和指定的命名空间。 [注意:在这种情况下, “包含”是指“直接或间接包含”。 ——尾注]

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

  • 使用指令:using namespace X;

  • 指定的命名空间:X

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

这不是暗示imain 中的非限定名称查找应该找到X::i?为什么我尝试的三个编译器都没有得到这个结果?

【问题讨论】:

  • "名称看起来好像它们已被声明" 仅适用于 Y 内的非限定查找。这就是第一句所说的,"names in the named namespaces可以在using-directive出现的范围内使用"

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


【解决方案1】:

使用指令使名称可见在它们出现的范围内。例如,[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 内执行的名称查找没有影响。

【讨论】:

  • 不幸的是,“范围”一词在这里以两种不同的方式使用; 名称的范围(如我的回答中所定义)和 命名空间范围(您可以在其中声明具有命名空间范围的名称的程序部分;但指的是单个命名空间)。
  • 是的,该标准有时会将范围与声明性区域混淆。有一个关于此的 c++ 标准核心语言问题。见:stackoverflow.com/questions/23630201/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-05-10
  • 1970-01-01
  • 1970-01-01
  • 2022-01-10
  • 2016-05-05
  • 2023-03-30
  • 1970-01-01
相关资源
最近更新 更多