lambda簡介
capture列表
mutable說明
c++11中的lambda 表示式用於定義並建立匿名的函式物件,以簡化程式設計工作。
lambda表示式一般都是從方括號開始,然後結束於花括號{},主要包括五個部分:
常見幾種lambda表示式形式:
表示式[ capture ] ( params ) mutable exception attribute -> ret
(1)
[ capture ] ( params ) -> ret
(2)
[ capture ] ( params )
(3)
[ capture ]
(4)
如在sort函式中應用lambda表示式:
std::sort(x, x + n,
// lambda expression begins
(float a, float b) );
對於lambda表示式,編譯器會自動生成乙個匿名類(過載()運算子
),稱為閉包型別(closure type);在執行時,就返回這個匿名閉包型別的例項。閉包的乙個強大之處是其可以通過傳值或者引用的方式捕獲其當前作用域內的變數,前面方括號就是用來定義捕獲模式以及變數的,因此又將其稱為lambda捕獲塊。
capture
是傳遞給閉包函式物件類的建構函式的:只能是那些lambda表示式所在作用範圍內可見的區域性變數及其所在類的this指標。
注意:capture並不能延長其捕獲變數的生命週期,因此只捕獲真正所需的變數,且避免懸掛引用的出現(在呼叫lambda表示式時,引用變數因超出其宣告域,而變的無效)。
預設情況下,使用值方式捕獲的變數是不允許改變的(類似const成員變數),在閉包物件內永遠儲存的是其最初捕獲時的值。若要對捕獲的值進行修改,則需要使用mutable修飾,修飾後:
如下所示:每次呼叫fun時都會累加fun物件內部的count,但是外部的ncount一直保持原來的值(10)。
int ncount = 10;
auto fun = [ncount]()mutable ;
fun();
fun();
cout << "out: " << ncount << endl;
// in: 11
// in: 12
// out: 10
C 11 lambda表示式 詳解
如下圖,lambda表示式由下面幾個部分構成 c 11 的 lambda 表示式規範如下 mutable 修飾符說明 lambda 表示式體內的 可以修改 獲的變數,並且可以訪問 獲物件的 non const 方法。exception 說明 lambda 表示式是否丟擲異常 noexcept 以及丟...
C 11 lambda 表示式解析
中括號中 from 下面是各種變數擷取的選項 小括號中,就是函式引數 lambda表示式可以作為其它函式引數 1 標準格式 有箭頭 就要顯示寫明返回值型別 auto pfunc1 this void pfunc1 2 簡化格式 void 型別返回值 沒有箭頭 會預設檢測返回值型別 auto pfun...
C 11 lambda表示式小結
目錄problems lambda表示式是乙個匿名內聯函式,可以定義別的函式體中,其形式如下 capture list parameter list return type從中可以看到,lambda只能使用尾置返回型別 尾置返回型別放在引數列表後邊以 開頭,然後再原來放返回型別的地方放乙個auto。...