c 11 新特性 lambda表示式

2021-06-26 12:08:11 字數 1609 閱讀 9084

iso c++ 11 標準的一大亮點是引入lambda表示式。基本語法如下:

[capture list] (parameter list) ->return type

其中除了「[ ]」(其中捕獲列表可以為空)和「復合語句」(相當於具名函式定義的函式體),其它都是可選的。它的型別是唯一的具有成員operator()的非聯合的類型別,稱為閉包型別(closure type)。

c++中,乙個lambda表示式表示乙個可呼叫的**單元。我們可以將其理解為乙個未命名的內聯函式。它與普通函式不同的是,lambda必須使用尾置返回來指定返回型別。

例如呼叫中的std::sort,iso c++ 98 的寫法是要先寫乙個compare函式:

1

2

3

4

boolcompare(int&a,int&b)

然後,再這樣呼叫:

1

sort(a,a+n,compare);

然而,用iso c++ 11 標準新增的lambda表示式,可以這麼寫:

1

sort(a,a+n,(inta,intb));//降序排序

這樣一來,**明顯簡潔多了。

由於lambda的型別是唯一的,不能通過型別名來顯式宣告對應的物件,但可以利用auto關鍵字和型別推導:

1

autof=(inta,intb));

和其它語言的乙個較明顯的區別是lambda和c++的型別系統結合使用,如:

1

2

3

4

autof=[=](inta,intb));//x**獲複製

intx=0,y=1;

autog=[&](intx));//y**獲引用,呼叫g後會修改y,需要注意y的生存期

bool(*fp)(int,int)=(inta,intb));//不捕獲時才可轉換為函式指標

lambda表示式可以巢狀使用。

即將出版的iso c++14支援基於型別推斷的泛型lambda表示式。上面的排序**可以這樣寫:

1

sort(a,a+n,(constauto&a,constauto&b));//降序排序:不依賴a和b的具體型別

因為引數型別和函式模板引數一樣可以被推導而無需和具體引數型別耦合,有利於重構**;和使用auto宣告變數的作用類似,它也允許避免書寫過於複雜的引數型別。特別地,不需要顯式指出引數型別使使用

高階函式變得更加容易。

C 11新特性 lambda表示式

為何要寫一篇博文呢?其實,系統學了c 一定會學到lambda表示式。不巧不巧,在秋招的浪潮中,我又被問到了關於lambda表示式,回過頭想一想,其實lambda表示式在c 中應用挺廣泛的。匿名函式,短小精悍,應該就是它的feature。好記性不如爛筆頭,書上有路勤為徑。可呼叫物件 對於任何乙個物件或...

C 11新特性 lambda表示式

在c 11以後,形如這樣的語法。capture parameters mutable return type 稱為乙個lambda表示式,表達乙個匿名函式。從程式設計的角度上看,lambda是一種函式式程式設計。分析語法 1.capture,可以通過值傳遞或者引用傳遞的方式給匿名函式提供訪問父作用域...

C 11 新特性之Lambda表示式

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