c 中的lambda表示式

2021-09-26 14:25:41 字數 3655 閱讀 9878

可變lambda

指定lambda返回型別

lambda丟擲異常

在 c++ 11 中,lambda 表示式(通常稱為 「lambda」)是一種在被呼叫的位置或作為引數傳遞給函式的位置定義匿名函式物件的簡便方法。 lambda 通常用於封裝傳遞給演算法或非同步方法的少量**行。

capture 子句(在 c++ 規範中也稱為 lambda 引導。)

引數列表(可選)。 (也稱為 lambda 宣告符)

可變規範(可選)。

異常規範(可選)。

尾隨返回型別(可選)。

「lambda 體」

lambda表示式又被稱作lambda函式,匿名函式。當乙個函式,你覺得不需要第二次用到它,你就可以把它寫成lambda函式,因為你沒必要給他起乙個名字,只要能實現功能就行。

[ ] 空捕獲列表,不捕獲任何變數

[=] 拷貝捕獲

[&] 引用捕獲

[=, &] 拷貝與引用混合

[names] names是乙個逗號分隔的名字列表,這些名字都是lambda所在函式的區域性變數。

[this] 捕獲 this 指標

舉例:

#include

using namespace std;

intmain()

;func

(i);

}

vs報錯:

error c3493: 無法隱式捕獲「i」,因為尚未指定預設捕獲模式

error c2064: 項不會計算為接受 0 個引數的函式

改正:

#include

using namespace std;

intmain()

;func

(i);

//這裡將i作為函式引數傳入

return0;

}

又如下:輸出hello world

#include

intmain()

();return0;

}

#include

using namespace std;

intmain()

;func()

;return0;

}

#include

using namespace std;

intmain()

;fun1()

;return0;

}

#include

using namespace std;

intmain()

;fun1()

;return0;

}

names是乙個逗號分隔的名字列表,這些名字都是lambda所在函式的區域性變數。

例1

#include

using namespace std;

intmain()

;fun1()

;return0;

}

例2

輸出:test hello!

#include

intmain()

(x)+3;

}(5)

;// print the result.

cout << timestwoplusthree << endl;

}

執行結果:輸出13

預設情況下,對於乙個值被拷貝的變數,lambda不會改變其值,如果我們希望能改變乙個**獲變數的值,就必須在引數列表尾加上關鍵字mutable。

如果加上mutable,則會使得該「值捕獲變數」的值,可以在**獲的值的基礎上進行變化(注意是能修改拷貝,而不是值本身)。

例如:

#include

using namespace std;

intmain()

; cout <

)<< endl;

cout <

)<< endl;

t =0;

cout <<

"after assign t=0, f() is: "

<

)<< endl;

cout <<

"t:"

<< t << endl;

return0;

}

執行結果:

在捕獲變數列表中值捕獲的變數t,它其實可以被看做函式物件f的乙個資料成員變數,其初始值為9,因此,函式體內對其每次的變動都會被累積。

1.不指定返回型別的情況。返回型別為void時,或者只有乙個return,編譯器就可以自動推導,而無需指定

auto func_1=

(int i)

;//編譯器推斷返回型別為int型

auto func_2=

(int i)

;//編譯器推斷返回型別為void型,也就是lambda不返回任何值;

2.必須指定返回型別的情況

當lambda函式體內包含不止乙個return語句時,編譯器就不能推斷其返回型別。例如:

auto func_3 =

(int i)

;//雖然兩個return語句都返回int型,

//但編譯器不能推斷出其返回型別,所以該語句會產生編譯錯誤。

auto func_3 =

(int i)

->

int;

//指定返回型別必須採用尾置返回型別(即-> type的形式)

#include

using namespace std;

intmain()

// c4297 expected()

;}

C 中Lambda表示式

c 語言還是比較常見的東西,這裡我們主要介紹c lambda表示式,包括介紹乙個lambda就是乙個delegate,乙個delegate指向乙個方法等方面。你有沒有接觸過c lambda表示式,有沒有覺得匿名方法這東西很不錯,減少了很多 阿,但是匿名方法的使用還並不人性化,什麼是人性化呢?比如你可...

C 中lambda表示式

在介紹lambda表示式之前,我想先介紹以下c 標準庫所支援的傳統謂詞以及傳統謂次的不足,而由此才引入的lambda表示式 謂詞是個可呼叫的表示式,其返回結果是乙個能作為條件的值。謂詞分為一元和二元,一元的可呼叫物件只能有乙個引數,二元只能有倆個引數 我們以一元謂詞舉例 c 標準庫中的find if...

C 中的Lambda表示式

c 11開始支援lambda表示式 原文 一段簡單的code 我也不是文藝的人,對於lambda的歷史,以及lambda與c 的那段淵源,我也不是很熟悉,技術人,講究拿 說事。複製 如下 include using namespace std int main return 0 當我第一次看到這段 ...