【问题标题】:Unqualified name lookup: Why local declaration hides declaration from using directive不合格的名称查找:为什么本地声明从 using 指令中隐藏声明
【发布时间】:2018-01-20 18:48:19
【问题描述】:

考虑这段代码:

namespace A
{
   int i = 24;
}

namespace B
{
    using namespace A;
    int i = 11;

    int k = i; // finds B::i, no ambiguity
}

还有basic.lookup.unqual.2:

§6.4.1 不合格名称查找 [basic.lookup.unqual]

  1. 来自 using 指令指定的命名空间的声明在包含 using 指令的命名空间中变得可见;看 [命名空间.udir]。出于非限定名称查找规则的目的 [basic.lookup.unqual] 中描述的,来自 由 using 指令指定的命名空间被认为是 那个封闭的命名空间。

对我来说,该标准非常清楚地表明,出于不合格名称查找的目的(int k = i 中的i),来自Ai 声明被视为B 的成员,因此i 应该在int k = i 中是模棱两可的,但是gccclang compile 和解析i 到本地B::i。我搜索了标准(basic.scope.hidingnamespace.udir),没有发现与上述标准相矛盾的例外或规则。我发现用于限定名称查找,但不适用于非限定名称查找。

为什么i 是明确的?

【问题讨论】:

标签: c++ c++14 language-lawyer name-lookup


【解决方案1】:

键是 10.3.4/2 “在非限定名称查找期间,名称看起来好像它们是在最近的封闭命名空间中声明的,其中包含使用指令和指定命名空间。”

指定的命名空间是 A,using 指令在 B 中,最小的(实际上只是)公共命名空间是全局命名空间。因此i 看起来好像在全局命名空间中声明,并被B::i 隐藏。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-11
    • 2019-04-24
    • 2017-09-21
    相关资源
    最近更新 更多