考虑以下代码:
namespace C {
class X {};
}
namespace A {
class X {};
namespace B {
using namespace C;
X x;
}
}
我当时期望,由于使用命名空间 < /代码> 指令的 < 代码>, < 代码> 类型为 < 代码> C:X < / 代码 >,但由于 < 代码 > 使用命名空间 < /代码 > 指令,因此 < em> VS2010 < /em > 和在线 LLLVM/Clang 汇编者分辨率 < 代码> < 代码> X < /代码 > 在命名空间 < 代码> B/代码 > 中的类型为 < 代码> A:X < /code > 。 使用声明修改使用指令( < 代码 > 使用 C:X < /code > ),然后按照预期,确定 < 代码> C:X < /code > 。
使用指令的标准[7.3.4.2]:
使用指令指定名称空间的名称可以用于使用指令之后使用指令的范围。在不附带条件的名称查询(3.4.1)中,名称似乎是在含有使用指令和指定名称空间的最近附件名称空间中申报的,该名称空间既包含使用指令,也包含指定的命名空间。
我读到的是, C::X
应该像在名称空间 B
中宣布的那样出现,有效地隐藏了 A:X
。使用指令和使用声明之间这种不一致之处背后是标准中的哪个部分?是否有办法通过使用指令从外部范围隐藏一个名字?