如下圖,lambda表示式由下面幾個部分構成:
c++11 的 lambda 表示式規範如下:
mutable 修飾符說明 lambda 表示式體內的**可以修改**獲的變數,並且可以訪問**獲物件的 non-const 方法。
exception 說明 lambda 表示式是否丟擲異常(noexcept),以及丟擲何種異常,類似於void f() throw(x, y)。
attribute 用來宣告屬性。
另外,capture 指定了在可見域範圍內 lambda 表示式的**內可見得外部變數的列表,具體解釋如下:
int a = 1;
int b = 2;
auto func = [=, &b](int c)->int ;
關於capture 中值[=]和引用[&]的區別下面是其它人部落格中看到一些容易出錯的lambda的用法:
#include
using
namespace
std;
int main()
; auto by_ref_lambda = [&];
cout
<
/ 11
cout
<
/ 11
++j;
cout
<
/ 11
cout
<
/ 12
return
0;
}
第三個輸出為什麼不是12呢?
在by_val_lambda中,j被視為乙個常量,一旦初始化後不會再改變(可以認為之後只是乙個跟父作用域中j同名的常量),
而在by_ref_lambda中,j仍然在使用父作用域中的值。
所以,在使用lambda函式的時候,如果需要捕捉的值成為lambda函式的常量,我們通常會使用按值傳遞的方式捕捉;
相反的,如果需要捕捉的值成成為lambda函式執行時的變數,則應該採用按引用方式進行捕捉。
關於 mutable 的深度理解
預設情況下,lambda函式總是乙個const函式,mutable可以取消其常量性。按照規定,乙個const的成員函式是不能在函式體內修改非靜態成員變數的值
#include
using
namespace
std;
int main()
; wrong!!!
auto mutable_val_lambda = [=]() mutable;
mutable_val_lambda();
cout
/ 0// 而對於引用的傳遞方式,並不會改變引用本身,而只會改變引用的值,因此就不會報錯了
auto const_ref_lambda = [&]() ;
const_ref_lambda();
cout
/ 4auto mutable_ref_lambda = [&]() mutable;
mutable_ref_lambda();
cout
/ 5return
0;
}
C 11 lambda 表示式解析
中括號中 from 下面是各種變數擷取的選項 小括號中,就是函式引數 lambda表示式可以作為其它函式引數 1 標準格式 有箭頭 就要顯示寫明返回值型別 auto pfunc1 this void pfunc1 2 簡化格式 void 型別返回值 沒有箭頭 會預設檢測返回值型別 auto pfun...
C 11 Lambda表示式簡介
lambda簡介 capture列表 mutable說明 c 11中的lambda 表示式用於定義並建立匿名的函式物件,以簡化程式設計工作。lambda表示式一般都是從方括號開始,然後結束於花括號 主要包括五個部分 常見幾種lambda表示式形式 表示式 capture params mutable...
C 11 lambda表示式小結
目錄problems lambda表示式是乙個匿名內聯函式,可以定義別的函式體中,其形式如下 capture list parameter list return type從中可以看到,lambda只能使用尾置返回型別 尾置返回型別放在引數列表後邊以 開頭,然後再原來放返回型別的地方放乙個auto。...