ラムダ式の文法

ラムダ式は[]で始まり、()の中に引数を書き、{}の中の分が実行される。

int main()
{
  // ラムダ式定義
  auto a=[]()
  {
    return true;
  };

  // 呼び出し
  a();
}

演算子operator()の、()が関数呼び出し演算子となる。

基本

ラムダ式は関数のように振る舞うオブジェクトを作るための式。

auto function = []( auto value ) { return value } ;

これの詳細は

[]   // ラムダ導入子
()   // 引数リスト
{}   // 複合文
;    // 文末

引数リストの省略

ラムダ式が引数を1つも取らない場合、引数リストは省略できる。

// 引数を取らないラムダ式
[](){};
// 引数リストの省略
[]{};

戻り値の型

ラムダ式の戻り値の型は、複合文内の、return文から推定される。

// 戻り値はdouble
[]{return 0.0;};
// 戻り値はint
[]{return 0;};

戻り値の型を指定したい場合は、引数リストの後に->を書き、型名を書く。

[](bool b) -> int{
  // doubleからintへ変換される
  return 0.0;
}

キャプチャー

ラムダ式は書かれている関数のローカル変数を使うことができる、キャプチャーという機能がある。

void f()
{
  // ローカル変数
  auto message = "hello"s;
  [=](){ std::cout << message; };
}

キャプチャーにはコピーとリファレンスがあり、[=]がコピーキャプチャー、[&]がリファレンスキャプチャー。

[this]キャプチャーはメンバ関数の中で使えるthisポインターをコピーキャプチャする。
this経由でメンバ変数は変更可能。
裏を返せば、[&]ではクラスのメンバ変数はキャプチャできない。が、なぜかビルドエラーにならないのが悩ましい。
詳細は、独習C++の「5.10.1 メンバー変数のキャプチャ」を参照。

class C
{
  int a;

public:
  void f()
  {
    [this](){
      std::cout << a << std::endl; // this->aと同じ意味。
    };
  }
};

※[*this]というキャプチャーもある模様。これについてはまだ理解していない。
参考:https://cpprefjp.github.io/lang/cpp17/lambda_capture_of_this_by_value.html
参考:独習C++の「5.10.3 インスタンス全体のコピー」

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です