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)

questionAnswers(1)

yourAnswerToTheQuestion