Typedef-name конфликтует с тегом struct в C ++

Это мое второе исследование об объявлении структуры в C ++. (ПервыйВот) Но теперь я наткнулсяэта почта, В частности, я не уверен, почему это прекрасно в C, но не в C ++.

typedef struct{
    int one;
    int two;
}myStruct;

struct myStruct; //forward declaration fails

void blah(myStruct* pStruct);

Приведенный выше код прекрасно компилируется на моем Ubuntu box с GCC. Я считаю, что это потому, что первыйmyStruct живет в нормальном пространстве имен, где живут функции, имена переменных. ВторойmyStruct живет вТег Пространство имен. Когда компилятор видитmyStruct* в прототипе функции, он ищет в обоих пространствах имен и нашелmyStruct в нормальном пространстве и это имя случаетсяtypedef имя, поэтому он может быть допустимым спецификатором типа. ВторойmyStruct позже может быть определено как то, что программист хочет. Там не будет никакой путаницы / столкновения с первымненазванный myStruct так как программист должен использоватьstruct myStruct сослаться на второй.

Но в C ++, согласно обсуждению, найденному всвязанный вопросНасколько я понимаю, что первыйЬурейеЕ myStruct живет в нормальном пространстве имен как обычно. ВторойmyStruct также живет в нормальном пространстве имен (без конкретныхтег пространство имен в C ++?), но может быть омрачено другими идентификаторами. Итак, мой вопрос, почему бы не первыйmyStruct который находится в том же пространстве имен, что и второйmyStruct тень второйmyStruct?

В более общем смысле, кроме явных пространств имен, введенных программистом с использованием средства пространства имен, предоставляемого языком C ++, существуют ли заранее определенные пространства имен, устраняющие неоднозначность использования идентификаторов (включая теги, метки, имена typedef, идентификаторы объектов / функций) как в C? (C имеет 4 предопределенных пространства имен, найденных в моем первом исследовании). Могу ли я найти их в стандарте C ++, указав, где эти имена принадлежат?

РЕДАКТИРОВАТЬКажется, я не задал вопрос достаточно ясно. Все, что я хочу знать, это

1) К каким пространствам имен (если таковые определены в языке) относятся Lables, имена typedef, имена тегов struct / union / enum, нормальная функция, нормальная переменная / имя объекта? (Если я пропустил другие названия, пожалуйста, добавьте.)

2) Почему обычное имя функции, обычное имя переменной, имена теневых тегов, а имена тегов - НЕ.

3) Если есть какие-либо предложения в C ++, которые определяют пространства имен, как в C (Раздел 6.2.1)

Ответы на вопрос(1)

Ваш ответ на вопрос