にゃははー

はへらー

lambdaが更に解らなくなってきた・・・

とある先輩から関数内のstaticかつlocalな変数はキャプチャーしなくてもlambda-expression内で参照できるとかできないとか聞かれて、VC2010だとなんかclが落ちるらしく、gccで試したら何も言われないで通った。

最初この話しが上がったとき、関数内のlocalな変数なんだからキャプチャしないと無理だろと思ったけど、コンパイルが通ったことで一気に解らなくなった。つまり以下のコードがwell-formedなのかということ。

void hoge( void )
{
    int i;
    static int si;
    //[] { return i; }; // もちろんill-formed
    [] { return si; }; // well-formed?
}

n3126のlambdaの項をずっと読んでいるが、未だによく解らん。globalと同じ寿命だからstaticな変数ならおkなのか・・・。

で、同じような状況としてclassメンバ関数内で宣言されるlambdaはどうなのかgccで試してみると、

struct S1
{
    int i;
    static int si;

    void g( void );
    static void sg( void );

    void f( void )
    {
        //[] { return i; }; // ill-formed
        [] { return si; }; // well-formed

        //[] { g(); }; // ill-formed
        //[] { sg(); }; // ill-formed?
    }
};

となった。上3つはいいのだが、staticなメンバ関数へのアクセスがなぜthisをキャプチャしないとできないのか。これがバグなのかはまだlambdaを理解しきれていない私程度では判断できないorz


追記:
lambdaと等価な状況を作ればいいと思ってlocalなstructを作って以下のコードをコンパイルすると、

void f( void )
{
    static int i;
    struct hoge
    {
        void f( void )
        {
            i;
        }
    } hoge h;
    h.f();
}

これが通るので、staticなlocal変数はC++03から見れるということだと思います。
ただ、staticメンバ関数はnon-staticメンバ関数内のstruct内から参照できているので、こちらはlambda側の実装のバグでしょう。