C++1y 一般化されたラムダキャプチャ

N3648 Wording Changes for Generalized Lambda-capture


ラムダ式のキャプチャ時に、変数名を付けれるようにしよう、という提案。

int x = 3;
auto f = [y = x + 1] { return y; } // x + 1にyという変数名を付けてラムダ式内で使用する

assert(f() == 4);

これによって、キャプチャする変数1つに対して、複数のキャプチャ方法を適用できるようになります。たとえば、変数xをコピーキャプチャした変数yと、参照キャプチャした変数zラムダ式内で同時に使用できます。

int x = 3;

// yはxをコピーキャプチャした変数、zはxを参照キャプチャした変数
auto f = [y = x, &z = x] { ... };

これは元々、boost::bind()ではできていたことなので、ラムダ式でもできるようになると、たしかにうれしいです。

それとこれは、ムーブキャプチャの代替として使えます。

promise<int> p;
future<int> f = p.get_future();

thread t([p = std::move(p)] { p.set_value(3); });

int result = f.get();
t.join();

この機能は、GCC 4.9に含まれる予定です。
GCC 4.9 Release Series - Changes, New Features, and Fixes