A GetA();

hoge()
{
A& a = GetA();
}

というのは文法的にどうなの?

Aがlongだとコンパイルエラー(long からlong&に型変換出来ない)で、
class A {}; だと警告も出ないんだけど。