Versteckt sich der Name im Namespace?

Betrachten Sie den folgenden Code:

namespace C {
    class X {};
}

namespace A {
    class X {};

    namespace B {
        using namespace C;

        X x;
    }
}

Ich habe die Art von erwartetx seinC::X aufgrund derusing namespace Richtlinie, sondern beideVS2010 und onlineLLVM / Clang CompilerauflösungX innerhalb des NamensraumsB seinA::X. Ändern der using-Direktive mit einer using-Deklaration (using C::X), dann löst es sich aufC::X wie erwartet.

Der Standard sagt über die Verwendung von Direktiven [7.3.4.2]:

Eine using-Direktive gibt an, dass die Namen im angegebenen Namespace in dem Bereich verwendet werden können, in dem die using-Direktive nach der using-Direktive erscheint. Während der Suche nach nicht qualifizierten Namen (3.4.1) werden die Namen so angezeigt, als wären sie im nächsten umschließenden Namespace deklariert, der sowohl die using-Direktive als auch den nominierten Namespace enthält.

Ich lese das soC::X sollte so aussehen, als ob sie im Namespace deklariert wäreBeffektiv verstecktA::X. Welche Abschnitte der Norm stecken hinter dieser Inkonsistenz zwischen der Verwendung von Richtlinien und der Verwendung von Deklarationen? Gibt es eine Möglichkeit, einen Namen durch eine using-Direktive vor einem äußeren Bereich zu verbergen?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage