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?