Czy używanie przestrzeni nazw powoduje ukrywanie nazw?

Rozważ następujący kod:

namespace C {
    class X {};
}

namespace A {
    class X {};

    namespace B {
        using namespace C;

        X x;
    }
}

Spodziewałem się tego typux byćC::X z powoduusing namespace dyrektywy, ale obieVS2010 i onlineLLVM / Clang rozwiązanie kompilatoraX w przestrzeni nazwB byćA::X. Zmiana dyrektywy za pomocą deklaracji using (using C::X), to się rozwiążeC::X zgodnie z oczekiwaniami.

Standard mówi o korzystaniu z dyrektyw [7.3.4.2]:

Dyrektywa using określa, że ​​nazwy w wyznaczonej przestrzeni nazw mogą być używane w zakresie, w którym dyrektywa-używając pojawia się po dyrektywie using. Podczas wyszukiwania nazwy niekwalifikowanej (3.4.1) nazwy pojawiają się tak, jakby były zadeklarowane w najbliższej otaczającej przestrzeni nazw, która zawiera zarówno dyrektywę using, jak i nazwaną przestrzeń nazw.

Moje czytanie tego jest takieC::X powinien wyglądać tak, jakby został zadeklarowany w przestrzeni nazwB, skutecznie się ukrywaA::X. Które sekcje standardu stoją za tą niespójnością między używaniem dyrektyw a używaniem deklaracji? Czy istnieje sposób na ukrycie nazwy przed zewnętrznym zakresem za pomocą dyrektywy używającej?

questionAnswers(1)

yourAnswerToTheQuestion