Visual Studio 2008 でコンパイルできたすごいコード

関数戻り値部分でのクラス定義

C++では,関数の戻り値の型を関数宣言/定義時に指定する.

Hoge func(){
    Hoge x;
    return x;
}

こんな感じに指定すると,先頭部分で関数の戻り値がHoge型だということがわかる.
クラスの定義は,

class Hoge{
    public:
        Hoge(){}
        void hello(){ std::cout << "Hello" << std::endl; }
};

という感じで行う.今回,これをくっつけてみたら,コンパイルが通った.

class Hoge{
    public:
        Hoge(){}
        void hello(){ std::cout << "Hello" << std::endl; }
} func(){
    Hoge x;
    return x;
}
int main(){
    Hoge a = func();
    a.hello(); // Helloが出力される
}

Visual Studio 2008では,コンパイルが通ったけど,gcc 4.4.5ではコンパイル通らなかった.gccでは,「class宣言の後ろにセミコロン抜けてるよ」というエラーが出力された.
文法的にはどっちが正しいのだろう?

コメントする