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