Мне интересно, почему правило объявления перед использованием С++ не содержится внутри класса.
Посмотрите на этот пример:
#ifdef BASE
struct Base {
#endif
struct B;
struct A {
B *b;
A(){ b->foo(); }
};
struct B {
void foo() {}
};
#ifdef BASE
};
#endif
int main( ) { return 0; }
Если BASE определена, код действителен.
Внутри конструктора я могу использовать B:: foo, который еще не был объявлен.
Почему это работает и, главным образом, почему работает внутри класса?