Использование пространства имен вызывает скрытие имени?
Рассмотрим следующий код:
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 C::X
), то это решитC::X
как и ожидалось.
Стандарт говорит об использовании директив [7.3.4.2]:
A using-directive specifies that the names in the nominated namespace can be used in the scope in which the using-directive appears after the using-directive. During unqualified name lookup (3.4.1), the names appear as if they were declared in the nearest enclosing namespace which contains both the using-directive and the nominated namespace.
Мое чтение этого таково, чтоC::X
должен выглядеть так, как если бы он был объявлен в пространстве именB
эффективно скрываетсяA::X
, Какие разделы стандарта стоят за этим несоответствием между использованием директив и использованием объявлений? Есть ли способ скрыть имя из внешней области с помощью директивы using?