Приводит ли использование пространства имен к сокрытию имени?

Рассмотрим следующий код:

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?

12
задан K-ballo 24 May 2012 в 16:20
поделиться