Возьмите эти определения классов:
Определение класса 1:
struct A
{
struct B* m_b;
};
Определение класса 2:
struct A
{
struct B;
B* m_b;
};
Оба определения класса должны объявлять B
как вложенный класс. По крайней мере, это то, что я подумал, прочитав следующее из проекта стандарта С++ 11:
9.1/2 Объявление класса вводит имя класса в область, где оно объявлено, и скрывает любой класс, переменную, функцию или другое объявление этого имени в охватывающей области (3.3). Если имя класса объявляется в области, где также объявляется переменная, функция или перечислитель с тем же именем, тогда, когда оба объявления находятся в области видимости, класс может ссылаться только с использованием специфицированного спецификатора типа `
Однако g++ 4.8.2 рассматривает их по-разному. В первом определении он рассматривает B
как класс, равный равному A
.
Следующая программа успешно завершена:
struct A
{
struct B* m_b;
};
void myfun(const B& b )
{
}
int main()
{
A a;
myfun(*a.m_b);
}
а следующая программа:
struct A
{
struct B;
B* m_b;
};
void myfun(const B& b )
{
}
int main()
{
A a;
myfun(*a.m_b);
}
Я понимаю, почему вторая программа не компилируется, но я не понимаю, почему первая программа успешно построена.
Я что-то пропускаю в интерпретации стандарта?
Правильно ли g++ 4.8.2 при компиляции первой программы?