[英]Does using namespace cause name hiding?
請考慮以下代碼:
namespace C {
class X {};
}
namespace A {
class X {};
namespace B {
using namespace C;
X x;
}
}
由於using namespace
命令,我期望x
的類型為C::X
,而VS2010和在線LLVM / Clang編譯器都將命名空間B
X
解析為A::X
使用using聲明( using C::X
)更改using指令,然后它按預期解析為C::X
標准說明使用指令[7.3.4.2]:
using-directive指定指定命名空間中的名稱可以在using-directive出現在using-directive之后的范圍內使用。 在非限定名稱查找(3.4.1)期間,名稱看起來好像是在最近的封閉命名空間中聲明的,其中包含using-directive和指定的命名空間。
我對此的解讀是C::X
應該看起來好像在命名空間B
聲明,有效地隱藏了A::X
標准的哪個部分是在使用指令和使用聲明之間的這種不一致的背后? 有沒有辦法通過using指令隱藏外部作用域的名稱?
關於using指令的章節似乎在某種程度上清楚地表明您正在看到預期的行為:
7.3.4p2 using-directive指定指定命名空間中的名稱可以在using-directive出現在using-directive之后的范圍內使用。 在不合格的名稱查找(3.4.1),名字看起來好像他們既包含了使用指示符和提名命名空間最近的封閉命名空間中聲明。
7.3.4p3 using-directive不會將任何成員添加到它出現的聲明區域。
也就是說, using-directive將命名空間的成員添加到指令的公共命名空間祖先和使用的命名空間的查找集中,而不是直接添加到使用using-directive的范圍。 這在第二個引用中明確說明:它不會將任何成員添加到using-directive的聲明區域。
后來有一個例子用於說明其他內容,但實際上顯示了這一點:
7.3.4p4 [...]另一個例子
namespace A {
int i;
}
namespace B {
int i;
int j;
namespace C {
namespace D {
using namespace A;
int j;
int k;
int a = i; // B::i hides A::i
}
最后一個示例用於闡明傳遞性(並包含更多代碼),但實際上,一旦刪除了額外的代碼,它就等同於您的代碼。
所以看起來在你的情況下, using-directive不是隱藏,而是隱藏。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.