【发布时间】: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
}
§6.4.1 不合格名称查找 [basic.lookup.unqual]
- 来自 using 指令指定的命名空间的声明在包含 using 指令的命名空间中变得可见;看 [命名空间.udir]。出于非限定名称查找规则的目的 [basic.lookup.unqual] 中描述的,来自 由 using 指令指定的命名空间被认为是 那个封闭的命名空间。
对我来说,该标准非常清楚地表明,出于不合格名称查找的目的(int k = i 中的i),来自A 的i 声明被视为B 的成员,因此i 应该在int k = i 中是模棱两可的,但是gcc 和clang compile 和解析i 到本地B::i。我搜索了标准(basic.scope.hiding 和namespace.udir),没有发现与上述标准相矛盾的例外或规则。我发现用于限定名称查找,但不适用于非限定名称查找。
为什么i 是明确的?
【问题讨论】:
-
这是另一个用户的问题的延续:stackoverflow.com/questions/48359294/…
标签: c++ c++14 language-lawyer name-lookup