c 之lambda 表示式

2021-10-02 16:56:56 字數 2304 閱讀 2889

也叫做lambda 函式, lambda 表示式的出現目的是為了提高編碼效率,但是它的語法卻顯得有點複雜。lambda表示式表示乙個可以執行的**單元,可以理解為乙個未命名的內聯函式。

1. lambda表示式的語法
在編寫lambda表示式的時候,可以忽略引數列表和返回值型別,但是前後的捕獲列表和函式體必須包含, 捕獲列表的中括號不能省略,編譯根據它來識別後面是否是lambda表示式,並且它還有乙個作用是能夠讓lambda的函式體訪問它所處作用域的成員。

//語法

[捕獲列表](引數列表)->返回值型別

()->int{};

//示例1:

(int a ,int b)->int ; //乙個簡單的加法

(int a ,int b) ; //如果能明確返回值型別,那麼 ->int 也可以省略掉

; //如果不需要引數,那麼引數列表頁可以忽略。至此不能再精簡了。

{} ; //這是最精簡的lambda表示式了,不過沒有任何用處,等於乙個空函式,沒有函式體**

2. 傳遞引數和獲取返回值
lambda表示式定義出來並不會自己呼叫,需要手動呼叫。

//1. 接收lambda表示式,然後呼叫

auto f = (int a ,int b)->int;

int result = f(3,4); //呼叫lambda函式,傳遞引數

//2. 不接收,立即呼叫。

int result= (int a ,int b)(3,4); //後面的小括號等同於呼叫這個函式。

3. 捕獲列表的使用
labmda表示式需要在函式體中定義,這時如果想訪問所處函式中的某個成員,那麼就需要使用捕獲列表了。捕獲列表的寫法通常有以下幾種形式:

形式

作用[a]表示值傳遞方式捕獲變數 a

[=]表示值傳遞方式捕獲所有父作用域的變數(包括this)

[&a]表示引用方式傳遞捕獲變數a

[&]表示引用傳遞方式捕獲所有父作用域的變數(包括this)

[this]表示值傳遞方式捕獲當前的this指標

[=,&a,&b]引用方式捕獲 a 和 b , 值傳遞方式捕獲其他所有變數 (這是組合寫法)

int main(); //值傳遞方式捕獲 a 和 b

cout << f1() << endl; //列印 8

auto f2 = [&a,&b];

cout << f2() << endl; //這裡列印35

cout << "a= "<< a << endl; //再列印一次,a 變成30了

}

4. lambda 的應用場景
編寫lamdda表示式很簡單,但是用得上lambda表示式的地方比較特殊。一般會使用它來封裝一些邏輯**,使其不僅具有函式的包裝性,也具有可見的自說明性。在c++ 中,函式的內部不允許在定義函式,如果函式中需要使用到某乙個函式幫助計算並返回結果,**又不是很多,那麼lambda表示式不失為一種上佳選擇。如果沒有lambda表示式,那麼必須在外部定義乙個內聯函式。 來回檢視**稍顯拖沓,定義lambda函式,距離近些,編碼效率高些。 lambda表示式就是內聯的。inline

計算6科考試總成績。

int getcout(vectorscores)

return result;

}int main();

//獲取總成績

int result = getcout(scores);

cout <<"總成績是: "<< result << endl;

}

lambda函式屬於內聯,並且靠的更近,也便於閱讀。

int main();

int result2 = [&]

return result;

}();

cout <<"總成績是2: "<< result2 << endl;

}

C 之lambda表示式

lambda表示式的語法歸納如下 capture子句 在 c 規範中也稱為 lambda 引導 引數列表 可選 可變規範 可選 異常規範 可選 尾隨返回型別 可選 lambda函式體 capture子句 capture子句指定要捕獲的變數以及是通過值還是引用進行捕獲。有與號 字首的變數通過引用訪問,...

c 之Lambda 表示式

1.介紹 lambda 表示式 lambda expression 是乙個匿名函式,lambda 表示式基於數學中的 演算得名,直接對應於其中的 lambda 抽象 lambda abstraction 是乙個匿名函式,即沒有函式名的函式。lambda 表示式可以表示閉包 注意和數學傳統意義上的不同...

C 之Lambda表示式

c 11 中的 lambda 表示式用於定義並建立匿名的函式物件,以簡化程式設計工作。lambda 的語法形式如下 函式物件引數 操作符過載函式引數 mutable 或 exception 宣告 返回值型別 可以看到,lambda 主要分為五個部分 函式物件引數 操作符過載函式引數 mutable ...