C++ 11中的Lambda表達式用於定義並創建匿名的函數對象,以簡化編程工作。
lambda 表達式使用一對方括號作為開始的標識,類似於聲明一個函數,只不過這個函數沒有名字,也就是一個匿名函數
Lambda表達式完整的聲明格式
[capture list] (params list) mutable exception-> return type { function body }
各個變量的含義
- capture list:捕獲外部變量列表
- params list:形參列表
- mutable指示符:用來說用是否可以修改捕獲的變量
- exception:異常設定
- return type:返回類型
- function body:函數體
[] // 不捕獲任何外部變量
[=]// 以值的形式捕獲所有外部變量,[=] 意味着,lambda 表達式以傳值的形式捕獲同范圍內的變量。4.5 float f0 = 1.0; std::cout << [=](float f) { return f0 + std::abs(f); } (-3.5);
[&] // 以引用形式捕獲所有外部變量,[&] 表明,lambda 表達式以傳引用的方式捕獲外部變量。 float f0 = 1.0; cout << [&](float f) { return f0 += std::abs(f); } (-3.5); cout << '\n' << f0 << '\n'; //輸出值是 4.5 和 4.5。
[x, &y] // x 以傳值形式捕獲,y 以引用形式捕獲 [=, &z]// z 以引用形式捕獲,其余變量以傳值形式捕獲 [&, x]// x 以值的形式捕獲,其余變量以引用形式捕獲
[] {cout << "Hello from Lambda" << endl; } ();//注意:尾部的(),這對括號使得這個lambda表達式立即執行:
string result = [](const string & str) -> string { return "Hello from " + str; }("second Lambda"); cout << "Result: " << result << endl; Result: Hello from second Lambda
//如果我不想讓 lambda 表達式自動推斷類型,或者是 lambda 表達式的內容很復雜,不能自動推斷怎么辦? //比如,std::abs(float)的返回值是 float,我想把它強制轉型為 int。那么,此時,我們就必須顯式指定 lambda //表達式返回值的類型 std::cout << [](float f) -> int { return std::abs(f); } (-3.5);
注意
- 對於[=]或[&]的形式,lambda 表達式可以直接使用 this 指針
- 對於[]的形式,如果要使用 this 指針,必須顯式傳入:[this]() { this->someFunc(); }();
參考:https://blog.csdn.net/qs9816/article/details/8888366