ラムダ式は[]で始まり、()の中に引数を書き、{}の中の分が実行される。
int main()
{
// ラムダ式定義
auto a=[]()
{
return true;
};
// 呼び出し
a();
}
演算子operator()の、()が関数呼び出し演算子となる。
Contents
基本
ラムダ式は関数のように振る舞うオブジェクトを作るための式。
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 インスタンス全体のコピー」
コメントを残す