Typedef-name entra em conflito com a tag struct em C ++
Esta é minha segunda investigação sobre declaração de estrutura em C ++. (O primeiro éaqui) Mas agora me depareiesta postagem. Especificamente, não sei por que isso é perfeitamente adequado em C, mas não em C ++.
typedef struct{
int one;
int two;
}myStruct;
struct myStruct; //forward declaration fails
void blah(myStruct* pStruct);
O código acima compila bem na minha caixa do Ubuntu com o GCC. Eu raciocino que é porque o primeiromyStruct
vive no espaço de nomes normal em que função, nomes de variáveis vivem. O segundomyStruct
vive noEtiqueta, rótulo, palavra-chave namespace. Quando o compilador vêmyStruct*
no protótipo de função, ele pesquisa nos dois namespaces e encontramyStruct
no espaço de nome normal e esse nome é umtypedef
nome, para que possa ser um especificador de tipo válido. O segundomyStruct
pode ser definido posteriormente como o que o programador quiser. Não haverá confusão / colisão com o primeirosem nome myStruct
desde que o programador tenha que usarstruct myStruct
para se referir ao segundo.
Mas em C ++, de acordo com a discussão encontrada nopergunta vinculada, meu entendimento é que o primeirotypedef myStruct
vive no espaço de nomes normal, como de costume. O segundomyStruct
também vive no espaço de nomes normaletiqueta, rótulo, palavra-chave namespace em C ++?), mas pode ser ofuscado por outros identificadores. Então, minha pergunta é por que o primeiro nãomyStruct
que está no mesmo espaço de nome que o segundomyStruct
sombreie o segundomyStruct
?
Em um sentido mais geral, além dos namespaces explícitos introduzidos pelo programador usando o recurso de namespace fornecido pela linguagem C ++, existem namespaces predefinidos que desambiguam o uso de identificadores (incluindo tags, rótulos, nomes de tipos de caracteres, identificadores de objeto / função) como em C? (C tem 4 namespaces predefinidos encontrados em minha primeira investigação). Posso encontrá-los no padrão C ++ afirmando onde esses nomes pertencem?
EDITAR: Parece que não fiz a pergunta com clareza suficiente. Tudo o que eu quero saber é
1) Quais namespaces (se houver definidos no idioma) pertencem Lables, typedef nomes, tags de struct / union / enum, função normal, variável normal / nome do objeto? (Se eu perder outro tipo de nome, adicione.)
2) Por que o nome normal da função, o nome normal da variável sombreia os nomes das tags, enquanto os nomes das tags NÃO podem.
3) Se houver alguma cláusula em C ++ que especifique os espaços de nome como em C (Seção 6.2.1)