mutableについて再び
ここで、保留になっていたmutableを引っ張り出しましょう。これを説明する前に、キャプチャ句によるキャプチャされた変数についての重要な性質があります。これは、コピーキャプチャされた外部変数でも、ラムダ式内で変更できない、ということです。コピーしたのに? と思いますよね。先ほどのリスト(クロージャクラスのイメージ)を見てください。関数がconstで修飾されています。つまり、この関数は外から来る変数を書き換えることができない、ということです。これは既定の動作で、これを以下のリストで確かめましょう。
int i = 100;
auto func_copy = [i]() { i++; return i; }; // i++は不可。コンパイルエラー
cout << func_copy() << endl;
書き換えたい場合にはmutableをラムダ式に付与します。
int j = 100;
auto func_copy_mutable = [j]() mutable { j++; return j; }; // OK
cout << func_copy_mutable() << endl; // 実行結果:101
なお、参照キャプチャの場合は、mutableの指定の有無にかかわらず参照先が変更できます。
まとめ
今回は、無名関数とも呼ばれるラムダ式を紹介しました。関数ポインタとおさらばできるだけでなく、キャプチャという便利な機能を活用できることをお伝えできたのではないかと思います。
次回は、C++でも使えるようになったモダンな言語仕様をピックアップして紹介します。
