C++11--Lambda表達式

《C++Primer》中對lambda表達式的解釋如下: 

lambda表達式表示一個可調用的代碼單元。我們可以將其理解爲一個未命名的內聯函數。 

微軟官網對lambda表達式的解釋如下: 


1、捕獲列表(capture list)
Lambda函數可以引用在它之外聲明的變量. 這些變量的集合叫做一個閉包. 閉包被定義在Lambda表達式聲明中的方括號[]內. 這個機制允許這些變量被按值或按引用捕獲.下面這些例子就是:  
[] //未定義變量.試圖在Lambda內使用任何外部變量都是錯誤的.
[x, &y] //x 按值捕獲, y 按引用捕獲.
[&] //用到的任何外部變量都隱式按引用捕獲
[=] //用到的任何外部變量都隱式按值捕獲
[&, x] //x顯式地按值捕獲. 其它變量按引用捕獲
[=, &z] //z按引用捕獲. 其它變量按值捕獲

2、參數列表(parameter list),可選

3、mutable 選項(可選)
加上mutable後,lambda表達式體內的語句可以修改按值捕獲的變量。

4、異常選項(可選)
加上throw()表示lambda表達式不拋出任何異常。

5、尾部返回類型(trailing-return-type) (可選)
一般來講lambda表達式的返回值都可以由編譯器自動猜測除非你指明瞭尾部返回類型。

6、函數體(function body)
和普通函數一樣。


Lambda表達式的一個重要用途 

使用標準庫函數的時候,可以大大簡化函數調用。
下面的代碼及使用建議來自《Google C++ Style Guide》
std::sort(v.begin(), v.end(), [](int x, int y) {
return Weight(x) < Weight(y);
});

int weight = 3;
int sum = 0;
// Captures `weight` by value and `sum` by reference.
std::for_each(v.begin(), v.end(), [weight, &sum](int x) {
sum += weight * x;
});

std::set<int> blacklist = {7, 8, 9};
std::vector<int> digits = {3, 9, 1, 8, 4, 7, 1};
digits.erase(std::remove_if(digits.begin(), digits.end(), [&blacklist](int i) {
return blacklist.find(i) != blacklist.end();
}),
digits.end());

Lambda表達式的使用建議
  • Keep unnamed lambdas short. If a lambda body is more than maybe five lines long, prefer to give the lambda a name, or to use a named function instead of a lambda.

發佈了89 篇原創文章 · 獲贊 212 · 訪問量 47萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章