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)
§6.4.1非限定名称查找[basic.lookup.unqual]
- using-directive提名的命名空间中的声明在包含using-directive的命名空间中可见; 见[namespace.udir].出于[basic.lookup.unqual]中描述的非限定名称查找规则的目的,using-directive指定的命名空间中的声明被视为该封闭命名空间的成员.
对我来说,标准说很清楚,对于不合格的名称查找(的目的i中int k = i)的声明,i从A被认为是成员B所以i应该是暧昧int k = i,不过双方gcc并clang 编译和解决i的地方B::i.我搜索了标准(basic.scope.hiding和namespace.udir),并没有找到与上述内容相矛盾的例外或规则.我发现对于限定名称查找,但不是对于非限定名称查找.
为什么i明确无误?
关键是10.3.4/2"在非限定名称查找期间,名称看起来好像是在最近的封闭命名空间中声明的,其中包含using-directive和指定的命名空间."
指定的命名空间是A,using指令在B中,最小的(实际上只有)公共命名空间是全局命名空间.因此i看起来好像在全局命名空间中声明,并被隐藏B::i.
| 归档时间: |
|
| 查看次数: |
162 次 |
| 最近记录: |