Рассмотрим следующий код:
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?