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側の実装のバグでしょう。