非限定名称查找:为什么本地声明隐藏使用指令的声明

bol*_*lov 6 c++ language-lawyer name-lookup c++14

考虑以下代码:

namespace A
{
   int i = 24;
}

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

    int k = i; // finds B::i, no ambiguity
}
Run Code Online (Sandbox Code Playgroud)

basic.lookup.unqual.2:

§6.4.1非限定名称查找[basic.lookup.unqual]

  1. using-directive提名的命名空间中的声明在包含using-directive的命名空间中可见; 见[namespace.udir].出于[basic.lookup.unqual]中描述的非限定名称查找规则的目的,using-directive指定的命名空间中的声明被视为该封闭命名空间的成员.

对我来说,标准说很清楚,对于不合格的名称查找(的目的iint k = i)的声明,iA被认为是成员B所以i应该是暧昧int k = i,不过双方gccclang 编译和解决i的地方B::i.我搜索了标准(basic.scope.hidingnamespace.udir),并没有找到与上述内容相矛盾的例外或规则.我发现对于限定名称查找,但不是对于非限定名称查找.

为什么i明确无误?

MSa*_*ers 6

关键是10.3.4/2"在非限定名称查找期间,名称看起来好像是在最近的封闭命名空间中声明的,其中包含using-directive和指定的命名空间."

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