MyUtils

View on GitHub

lambda式/関数ポインタについて


基本系

#include <iostream>
using namespace std;

int main() {
    // あくまで定義だけ(x,x)で引数を定義できる。
    // -> type で戻り値を
    auto f = [](int i, int j) -> int {
    return i * j;
  };

  cout << f(2, 3) << endl;
}


引数について

🚨 ラムダ式がひとつ以上の変数を参照キャプチャしている場合、参照している変数の寿命が切れたあとの、ラムダ式のコピーと呼び出しの動作は未定義。

#include <iostream>
using namespace std;

int main() {
  int i = 0;
  // []にはキャプチャリストと言ってiを固定値にしている。
  auto f = [i](int j) {
    cout << "i = " << i << endl;
    cout << "j = " << j << endl;

    // 🌟戻り値の型は推論で判定してもらう,,,
    // returnがなきゃvoidになるっぽい
    return i+j;
  };

  // 🌟 []() ->type{} で戻り値の型を指定する
  auto f2 = [i](int j) -> int {
    cout << "i = " << i << endl;
    cout << "j = " << j << endl;

    return i+j;
  };

  i = 1;
  f(i);
}

出力

g++ -std=c++11 test.cpp
./a.out 
i = 0
j = 1

関数ポインタへの変換


void foo(int(*fp)(int, int))
{
  int result = fp(2, 3);
  std::cout << result << std::endl;
}

int main()
{
  // lambda式を関数ポインタとして扱う
  auto lmbd = [](int a, int b) { return a + b; }
  foo(lmbd);
}