C++ ラムダ式の基本とキャプチャ


C++のラムダ式についてメモを残します。

ラムダ式の基本

// 引数と返り値を省略しない
auto show = [](int num)-> void{
    std::cout << num << std::endl;
};

// 引数と返り値を省略する
auto show2 = [](){
    std::cout << 'a' << std::endl;
};

show(42);  // 42
show2();   // a
  • 関数をその場で定義する構文
  • 関数の引数かautoで宣言した変数に代入することが多い
  • ラムダ式はコンパイラが自動で作る一意の型を持ったオブジェクトになるのでautoで宣言する必要がある
  • 引数がない場合や返り値がない場合もある

キャプチャ

int a = 0;
int b = 22;

// この時点のaがコピーされる
auto lamda = [a](){
  std::cout << a << std::endl;
};

// aのみコピーされてbはされない
// mutableを宣言したのでaは変更可能
auto lamda2 = [=]()  mutable{
  a = 200;
  std::cout << a << std::endl;
};

a = 100;

lamda();    // 0
lamda2();   // 200

  • ラムダ式の外側で宣言されている変数のコピーをラムダ式内部で使えるようにする
  • 引数のようにラムダ式を呼ぶときに渡さなくても良い
  • [=]でデフォルトキャプチャ、コンパイラが必要な分だけ自動出キャプチャしてくれる
  • キャプチャした変数は暗黙的にconstとなるため変更することはできない
  • mutableを宣言すると変更できるが、すべてのキャプチャした変数に影響が出る
  • [&a]など参照でキャプチャすることもできる