Nota: esta questão é sobre name space
, não namespace
.
O padrão C ++ tem algumas referências a name space
, mas não vejo a definição disso. Os padrões dizem que rótulos e macros estão em diferentes espaços de nome. Todas as outras referências name space
estão na seção de compatibilidade com C / C ++, como esta ( rascunho atual ):
Essa é uma das poucas incompatibilidades entre C e C ++ que podem ser atribuídas à nova definição de espaço de nome C ++, na qual um nome pode ser declarado como um tipo e um não-tipo em um único escopo, fazendo com que o nome não-tipo oculte o nome do tipo e exigindo que as palavras-chave classe, estrutura, união ou enum sejam usadas para se referir ao nome do tipo. Essa nova definição de espaço de nome fornece conveniências notacionais importantes aos programadores de C ++ e ajuda a tornar o uso dos tipos definidos pelo usuário o mais semelhante possível ao uso de tipos fundamentais.
Qual é essa nova definição de espaço para nome ? Onde posso encontrá-lo no padrão? Quais são as regras exatas? As regras parecem ser mais complicadas do que "tipos não ocultos". Como, isso não compila:
typedef int Foo; // Foo is a type
void Foo(); // not a type, but compile error, instead of hiding
Mas isso faz:
struct Foo { }; // Foo is a type as well
void Foo(); // This hides the type Foo. "struct Foo" refers to the type
E isso também não compila:
struct Foo { }; // Type
namespace Foo { } // Non-type, but compiler error instead of hiding
fonte
[stmt.label]/1
e outro para macros[cpp]/8
.Respostas:
O nome do espaço termo pode ser mais bem estabelecido na norma ISO C; citando a ISO C11 :
A nova definição de espaço de nome do C ++ não é, de maneira alguma, recente no tempo e foi descrita em [diff.class] / 1 em sua forma atual desde a introdução do padrão ISO C ++ em 98 . Ele só é mencionado em qualquer extensão nos contextos para os quais difere da ISO C, conforme [diff.class] / 1, que é citado pelo OP.
Afaics, precisamos recorrer à ISO C11 / 6.2.3 e combiná-la com [diff.class] / 1 da norma ISO C ++ para obter uma descrição coesa e completa da (nova) definição de espaço de nome do C ++ , menos que flagelemos a ISO Padrão C ++ para, por exemplo, [basic.scope.hiding] , [class.name] / 2 , [stmt.label] / 1 , [cpp.replace] / 8 e assim por diante para ver como e onde se aplica.
fonte
Em C (6.2.3 Espaços de nomes dos identificadores), a noção de espaços de nomes é definida da seguinte maneira.
Por exemplo, um nome de tag de estrutura pode coincidir com um nome de função porque eles pertencem a diferentes espaços de nome. Quando você especifica uma estrutura com um nome de marca de estrutura quando precisa usar a palavra-chave
struct
. Por exemplo, essas declarações não entram em conflito.Nesse trecho de código, o nome
s
do tag da estrutura não entra em conflito com o nome da função,s
porque o nome do tag deve ser especificado com a palavra-chavestruct
.No C ++, você tem permissão para usar nomes de tags de estrutura sem a palavra-chave
struct
.Por exemplo
é um código correto. Nesta declaração
o nome do identificador declarado
s
oculta o nome da estrutura. Então, se você escreverá, por exemploo compilador emitirá um erro porque nesta declaração s é considerado como o nome do identificador declarado acima. Para resolver a ambiguidade, você precisa usar a palavra-chave struct
Isso é descrito na seguinte citação do C ++ 20 Standard (6.3.1 Regiões e escopos declarativos)
Como você pode ver na citação, um nome de espaço para nome deve ser exclusivo em sua região declarativa. Então, essas declarações
estão incorretos.
fonte