Я думаю, его магия компилятора заставляет его работать. Я согласен с вами, что в идеале это должна быть ошибка компилятора (по крайней мере, меня смущает).
Если вы попробуете что-то вроде
#include <iostream>
class Test { public: int member; };
Test Test; // comaeu warns 'expression has no effect!'
Test.member = 10; // dosen't compile!
int main(){
Test Test;
Test.member = 10; // compiles fine after global 'Test's are commented!!
std::cout<<Test.member<<std::endl;
return 0;
}
Использование «Test.member» в глобальной области видимости не компилируется, но то же самое работает внутри «main ()» после того, как оба глобальных «Test» прокомментированы.
C ++ имеет достаточно сложностей, чтобы взволновать программистов, как насчет того, чтобы компиляторы тоже внесли свой вклад :-)?