①.概念
一個 lambda 通過將局部變量包含在其捕獲列表中來指定將會使用這些變量,只能使用明確指明的變量;變量捕獲方式可以傳值捕獲,也可以傳引用捕獲。
②.按值捕獲變量
在捕獲列表中指定變量名字,類似傳值的參數,被捕獲的變量值將在 lambda 創建時被拷貝。
③.按引用捕獲變量
用 & 引用捕獲,一個以引用方式捕獲的變量,在 lambda 中被使用時,實際上使用的引用所綁定的對象。
④.多參數捕獲
捕獲列表中可以指定捕獲多個參數,并且可以為每個參數指定捕獲方式。
⑤.隱式按值捕獲
使用 [=] 表示按值捕獲 lambda 所在范圍內所有可見的局部變量。
⑥.隱式按引用捕獲
使用 [&] 表示按引用方式捕獲 lambda 所在范圍內所有可見的局部變量。
⑦.隱式混和捕獲
使用 [=,prams] 表示除 xxx 按引用捕獲外,其他所有參數按值捕獲;使用 [&,prams]? 表示除 xxx 按值捕獲外,其他所有參數按引用捕獲。
如果一個 lambda 函數體包含了 return 之外的任何語句,則編譯器假定返回類型為 void,此時我們必須指定返回值類型。
定義一個 lambda ,編譯器會生成一個與 lambda 對應的新的類類型。當向一個函數傳遞一個 lambda 時,同時定義了一個新類型和該類型的一個對象,生成的類包含所捕獲變量對應的數據成員,數據成員在類創建時被初始化。
int sum = 0;std::vector<int> vec = { 1,2,3,4,5 };std::for_each(begin(vec), end(vec), [&sum](int x){sum += x;});
上述代碼被編譯器翻譯后變為:
class lambda_b{private: int* m_pSum;public: lambda_b(int* pSum) { m_pSum = pSum; } void operator()(int x) const { *m_pSum += x; }};int sum = 0;std::vector<int> vec = { 1,2,3,4,5 };std::for_each(begin(arry), end(arry), lambda_b(&sum));
06PARTlambda 使用lambda 表達式實際為一個函數對象,可以把匿名函數保存在變量當有名函數來使用。
①.使用 auto 保存
int a = 1;int b = 2;//使用 auto 保存 lambda auto func = [a, &b](int c)mutable ->int { b = a + c; return a; };//做有名函數使用 cout << b << " "<< func(10) << endl;
②.函數指針保存
當 lambda 的捕獲外部變量列表為空時,可使用普通函數指針來保存。
//使用函數指針保存 lambda int(*func1)(int) = [](int x) {return x; };//函數調用int a = func1(20);
③.使用 std::function 模板類型
#include std::function<float(int,float)> fun1 = [](int x, float y) { return x + y; };float a = fun1(12,1.2);//函數調用
函數對象C++ 可調用對象(一)
