O uso do namespace causa a ocultação de nomes?
Considere o seguinte código:
namespace C {
class X {};
}
namespace A {
class X {};
namespace B {
using namespace C;
X x;
}
}
Eu estava esperando o tipo dex
ser estarC::X
devido aousing namespace
directiva, mas em vez disso ambosVS2010 e onlineLLVM / Clang resolução do compiladorX
dentro do namespaceB
ser estarA::X
. Alterar a diretiva using com uma declaração using (using C::X
), então resolveC::X
como esperado.
A norma diz sobre o uso de diretivas [7.3.4.2]:
Uma diretiva using especifica que os nomes no namespace nomeado podem ser usados no escopo no qual a diretiva using aparece após a diretiva using. Durante a consulta de nome não qualificada (3.4.1), os nomes aparecem como se fossem declarados no namespace delimitador mais próximo que contém tanto a diretiva using como o namespace nomeado.
Minha leitura disso é queC::X
deve aparecer como se declarado dentro do namespaceB
, efetivamente escondendoA::X
. Quais seções do padrão estão por trás dessa inconsistência entre o uso de diretivas e o uso de declarações? Existe alguma maneira de ocultar um nome de um escopo externo por uma diretiva usando?