ラムダ式は[]で始まり、()の中に引数を書き、{}の中の分が実行される。
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 インスタンス全体のコピー」
コメントを残す