Рассмотрим следующий код:Является ли использование пространства имен причиной скрытия имени?
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]:
А с использованием директивы указывает, что имена в выдвинутого имен могут быть использованы в объеме, в котором с помощью директивы появляется после использования -directive. При неквалифицированном поиске имени (3.4.1) имена отображаются так, как если бы они были объявлены в ближайшем охватывающем пространстве имен, которое содержит как директиву-по умолчанию, так и назначенное пространство имен.
Мое чтение этого является то, что C::X
должно появиться, если объявленная в пространстве имен B
, эффективно скрывая A::X
. Какой раздел (ы) стандарта находится за этой несогласованностью между использованием директив и использованием деклараций? Есть ли способ скрыть имя из внешней области с помощью директивы using?
Возможно, ключ находится в * именах, как если бы они были объявлены в ближайшем охватывающем пространстве имен, которое содержит ** как ** директиву использования, так и номинированное пространство имен *. Не будет ли это '::'? И если это так, сначала будет обнаружен «A :: X» (поиск происходит из внутреннего пространства имен) ... но не уверен, но g ++ также делает «A :: X», поэтому он очень * согласованный между компиляторами. –
@David Rodríguez - dribeas: О, это объяснило бы это ... –