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äreB
effektiv 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?