次のコードを検討してください。
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) では、名前は、using ディレクティブと指定された名前空間の両方を含む、最も近い外側の名前空間で宣言されているかのように表示されます。
これについての私の読みはC::X
、あたかも namespace 内で宣言されているかのように見えB
、事実上 を隠しているということA::X
です。ディレクティブの使用と宣言の使用の間のこの不一致の背後にある標準のセクションはどれですか? using ディレクティブによって外部スコープから名前を隠す方法はありますか?