Рассмотрим следующий код:
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 (using C::X
), тогда он разрешает C::X
, как ожидалось.
В стандарте говорится об использовании директив [7.3.4.2]:
В директиве using указано, что имена в номенклатурном пространстве имен могут использоваться в области, в которой появляется директива using после директивы use. При неквалифицированном поиске имени (3.4.1) имена отображаются так, как если бы они были объявлены в ближайшем охватывающем пространстве имен, которое содержит как директиву-использование, так и номинированное пространство имен.
Мое прочтение этого состоит в том, что C::X
должно выглядеть так, как будто объявлено в пространстве имен B
, эффективно скрывая A::X
. Какой раздел стандарта находится за этой несогласованностью между использованием директив и использованием деклараций? Есть ли способ скрыть имя из внешней области с помощью директивы using?