ラムダ式メモ

当たり前のことなのだけれど、当たり前が当たり前ではないC++(特に思い込みは怖い)。というわけでメモ。
ラムダ式って無名関数オブジェクトなので、コピーキャプチャを生成すると、その変数は関数オブジェクトの寿命が尽きるまで値を保持され続けるんですね。疑問に思って何となく以下のコードを書きました。予想通りの挙動です。

#include <iostream>

int main()
{
	int k = 0;
	{
		std::cout << "copy\n";
		auto func = [ = ]() mutable { std::cout << k++ << std::endl; };
		for( int i = 0; i < 3; ++i )
		{
			func();
		}
	}

	{
		std::cout << "created copy lambda in loop\n";
		for( int i = 0; i < 3; ++i )
		{
			[ = ]() mutable { std::cout << k++ << std::endl; }();
		}
	}

	std::cout << "original:";
	std::cout << k << std::endl;

	return 0;
}

結果

copy
0
1
2
created copy lambda in loop
0
0
0
original:0

というメモ、done......