C 11 匿名函式Lambda表示式

2021-07-28 15:27:24 字數 1573 閱讀 4308

c++ 11匿名函式lambda表示式

語法

[ capture-list ] ( params ) mutable exception attribute -> ret

[ capture-list ] ( params ) -> ret

[ capture-list ] ( params )

[ capture-list ]

引數說明

mutable 允許body修改按複製捕獲的引數,及呼叫其非const成員函式

exception為呼叫lambda提供異常規定或noexcept子句

attribute 為呼叫lambda提供屬性規定

capture-list捕獲引數列表

[a, &b] 其中a以const值捕獲而b以引用捕獲。

[this] 以值捕獲this指標

[&] 以引用捕獲所有使用的自動變數,及以引用捕獲當前物件,若它存在

[=] 以值捕獲所有使用的自動變數,及以引用捕獲當前物件,若它存在

無捕獲params 引數列表,引數型別可以用auto代表泛型

ret 返回型別。若不寫,則為函式的return語句所隱喻(或若函式不返回任何值則為void)

body 函式體

lambda表示式本身是乙個物件,過載了()運算子,operator()。

以值捕獲的引數對像內會有乙個副本,是const型別,如果需要改變這個值需要引數列表後加上mutable關鍵字。

以引用捕獲的引數,物件內會儲存乙個指標,型別為t *const p,指標指向捕獲前的引數,所以引用方式捕獲的引數,lambda內可以改變捕獲引數的值。

當通過引用捕獲引數時,要確保lambda表示式執行時,引數記憶體沒有被釋放,否容易導致崩潰。特別是以引用的方式捕獲棧上的引數,結束完賦值後很有可能已經離開了棧空間。

例:struct

mystruct ;

void f(

mystruct 

*pstruct)

;}

lambda表示式本身也是乙個物件,在執行lambda表示式時要防止lambda表示式物件自己被釋放,lambda表示式物件釋放後,捕獲的引數也被釋放了。

struct b

; b

*f2()

;return b;

}

c 11匿名函式Lambda

定義乙個lambda函式 auto f capture params opt ret f 呼叫函式其中 capture表示捕獲函式作用域外的外部變數 params是引數 非必須 opt是函式選項,例如可選擇是否允許更改capture到的外部變數 ret表示函式返回型別,一般可以免了,因為我們在f前面...

lambda 函式或者匿名函式(C 11)

lambda 函式也就是沒有名字的函式,一般情況下,在任何地方,如果需要把乙個函式作為引數給出,但你寧願給出乙個簡短即時函式定義,而不是乙個指向原始檔其他地方或者另乙個模組中提供的定義的指標時,lambda 函式可能是有用的,lambda 函式可以作為 動態 給出的乙個快捷方便的函式,而不是正式定義...

C 11中的匿名函式(lambda)

c 11提供了對匿名函式的支援,稱為lambda函式 也叫lambda表示式 下面舉了幾個lambda函式的例子 int x,int y 隱式返回型別 int x 沒有return語句 lambda 函式的返回型別是 void 沒有引數,僅訪問某個全域性變數 與上乙個相同,省略了 指定返回型別 in...