考虑以下代码:
namespace A
{
int i = 24;
}
namespace B
{
using namespace A;
int i = 11;
int k = i; // finds B::i, no ambiguity
}
§6.4.1非限定名称查找[basic.lookup.unqual]
- using-directive提名的命名空间声明在包含using-directive的命名空间中可见;看到 [namespace.udir]。出于非限定名称查找规则的目的 在[basic.lookup.unqual]中描述,来自的声明 using-directive提名的名称空间被认为是成员 封闭命名空间。
醇>
对我而言,标准清楚地表明,为了进行无限制名称查询(i
中的int k = i
),来自i
的{{1}}声明被认为是A
因此B
i
int k = i
应该含糊不清,但gcc
和clang
compile并i
解析为B::i
{1}}。我搜索了标准(basic.scope.hiding和namespace.udir)并没有找到与上述内容相矛盾的例外或规则。我发现对于限定名称查找,但不是对于非限定名称查找。
为什么i
明确无误?
答案 0 :(得分:6)
密钥是10.3.4 / 2&#34;在非限定名称查找期间,名称看起来好像是在最近的封闭命名空间中声明的,其中包含using-directive和指定的命名空间。&#34; < / p>
指定的命名空间是A,using指令在B中,而最小的(实际上只是)公共命名空间是全局命名空间。因此,i
看起来好像在全局命名空间中声明,并被B::i
隐藏。