まだ読んでいないのですが、C++0xで導入される予定らしいラムダ関数とクロージャ関係の論文。
ラムダ関数はこのような記述になるようです。
for_each(v.begin(), v.end(), <>(int x) -> { cout << x; });
ローカル変数を参照で束縛するには、以下のようにexternを使うようです。
int sum = 0;
for_each(v.begin(), v.end(),
<>(int x) -> extern(sum) { return sum += x; });
externしない場合にはコピーが束縛されるようで、その場合には束縛した変数の寿命が終わってしまっても問題ないようですが、参照で束縛した場合には当然ですが寿命が終われば参照できなくなります。
tr1::function<int(int)> f;
void foo() {
int y = 0;
f = <>(int x) int extern(y) { return x + y; };
}
f(); // yの寿命が終わってから参照しているので未定義の動作
tr1::function<int(int)> g;
void bar() {
int y = 0;
f = <>(int x) int { return x + y; };
}
g(); // これはOK
// ただし、無名関数のoperator()はconstなので
// yを変更しようとするとコンパイルエラー
boost::lambdaよりは記述しやすいと思いますが、C++もますます複雑になるばかり。