考慮下面的代碼:是否使用名稱空間導致名稱隱藏?
namespace C {
class X {};
}
namespace A {
class X {};
namespace B {
using namespace C;
X x;
}
}
我期待的x
類型爲C::X
由於using namespace
指令,而是既VS2010和命名空間B
內在線LLVM/Clang的編譯決心X
爲A::X
。使用使用聲明(using C::X
)更改using指令,然後按預期方式解決爲C::X
。
的標準說使用指令在[7.3.4.2]:
A,使用-指令指定,在指定名稱空間中的名稱可以在其中使用指示符的使用後出現的範圍內使用-指示。在非限定名稱查找(3.4.1)期間,這些名稱看起來好像是在最近的包含using-directive和提名名稱空間的封閉名稱空間中聲明的。
我對此的解讀是,彷彿命名空間B
內聲明,從而有效地隱藏A::X
C::X
應該會出現。標準中的哪些部分背後是使用指令和使用聲明之間的不一致?有沒有辦法通過using指令來隱藏外部作用域的名稱?
也許線索在*中,這些名字看起來好像它們是在最近的封閉名稱空間中聲明的一樣,它們都包含** using-directive和提名的名稱空間*。那不是'::'?如果是這樣的話,會不會先找到A :: X(查找從內部命名空間出來)......但是不確定,但是g ++也提取了'A :: X',所以它非常*在編譯器中保持一致。 –
@DavidRodríguez - dribeas:哦,那會解釋它... –