考虑以下代码:
namespace C {
class X {};
}
namespace A {
class X {};
namespace B {
using namespace C;
X x;
}
}
我期待的类型x
是C::X
由于using namespace
指令,但是VS2010和在线LLVM/Clang编译器X
都在命名空间内解析B
为A::X
. 使用 using 声明 () 更改 using 指令using C::X
,然后它会C::X
按预期解析。
该标准说明了使用指令 [7.3.4.2]:
using-directive 指定指定命名空间中的名称可以在 using-directive 出现在 using-directive 之后的范围内使用。在非限定名称查找 (3.4.1) 期间,名称看起来好像它们是在最近的封闭命名空间中声明的,其中包含使用指令和指定命名空间。
我对此的解读是,它C::X
应该看起来好像在命名空间中声明B
,有效地隐藏A::X
。使用指令和使用声明之间的这种不一致背后是标准的哪些部分?有没有办法通过 using 指令从外部范围隐藏名称?