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

时间:2018-01-20 18:48:20

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

考虑以下代码:

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-directive提名的命名空间声明在包含using-directive的命名空间中可见;看到   [namespace.udir]。出于非限定名称查找规则的目的   在[basic.lookup.unqual]中描述,来自的声明   using-directive提名的名称空间被认为是成员   封闭命名空间。
  2.   

对我而言,标准清楚地表明,为了进行无限制名称查询(i中的int k = i),来自i的{​​{1}}声明被认为是A因此B i int k = i应该含糊不清,但gccclang compilei解析为B::i {1}}。我搜索了标准(basic.scope.hidingnamespace.udir)并没有找到与上述内容相矛盾的例外或规则。我发现对于限定名称查找,但不是对于非限定名称查找。

为什么i明确无误?

1 个答案:

答案 0 :(得分:6)

密钥是10.3.4 / 2&#34;在非限定名称查找期间,名称看起来好像是在最近的封闭命名空间中声明的,其中包含using-directive和指定的命名空间。&#34; < / p>

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