C 11語言特性 Lambda表示式

2021-10-10 04:04:14 字數 2012 閱讀 5635

利用lambda表示式,可以方便的定義和建立匿名函式。

lambda表示式完整的宣告格式如下:

[capture list] (params list) mutable exception-> return type
各項具體含義如下

capture list:捕獲外部變數列表

params list:形參列表

mutable指示符:用來說用是否可以修改捕獲的變數

exception:異常設定

return type:返回型別

function body:函式體

此外,我們還可以省略其中的某些成分來宣告「不完整」的lambda表示式,常見的有以下幾種:

序號格式

1[capture list] (params list) -> return type

2[capture list] (params list)

3[capture list]

其中:(1):如果function body中存在return語句,則該lambda表示式的返回型別由return語句的返回型別確定;

(2):如果function body中沒有return語句,則返回值為void型別。

下面,我們就重點介紹一下lambda表示式各項的具體用法。

lambda表示式可以使用其可見範圍內的外部變數,但必須明確宣告(明確宣告哪些外部變數可以被該lambda表示式使用)。那麼,在**指定這些外部變數呢?lambda表示式通過在最前面的方括號來明確指明其內部可以訪問的外部變數,這一過程也稱過lambda表示式「捕獲」了外部變數。

類似引數傳遞方式(值傳遞、引入傳遞、指標傳遞),在lambda表示式中,外部變數的捕獲方式也有值捕獲、引用捕獲、隱式捕獲。

1、值捕獲

值捕獲和引數傳遞中的值傳遞類似,**獲的變數的值在lambda表示式建立時通過值拷貝的方式傳入,因此隨後對該變數的修改不會影響影響lambda表示式中的值。

需要注意的是,如果以傳值方式捕獲外部變數,則在lambda表示式函式體中不能修改該外部變數的值。

2、引用捕獲

使用引用捕獲乙個外部變數,只需要在捕獲列表變數前面加上乙個引用說明符&。引用捕獲的變數使用的實際上就是該引用所繫結的物件。

3、隱式捕獲

值捕獲和引用捕獲都需要我們在捕獲列表中顯示列出lambda表示式中使用的外部變數。除此之外,我們還可以讓編譯器根據函式體中的**來推斷需要捕獲哪些變數,這種方式稱之為隱式捕獲。隱式捕獲有兩種方式,分別是[=]和[&]。[=]表示以值捕獲的方式捕獲外部變數,[&]表示以引用捕獲的方式捕獲外部變數。

4、混合方式

lambda表示式還支援混合的方式捕獲外部變數,這種方式主要是以上幾種捕獲方式的組合使用。

到這裡,我們來總結一下:c++11中的lambda表示式捕獲外部變數主要有以下形式:

捕獲形式說明

不捕獲任何外部變數

[變數名, …]

預設以值得形式捕獲指定的多個外部變數(用逗號分隔),如果引用捕獲,需要顯示宣告(使用&說明符)

[this]

以值的形式捕獲this指標

[=]以值的形式捕獲所有外部變數

[&]以引用形式捕獲所有外部變數

[=, &x]

變數x以引用形式捕獲,其餘變數以傳值形式捕獲

[&, x]

變數x以值的形式捕獲,其餘變數以引用形式捕獲

前面我們提到過,在lambda表示式中,如果以傳值方式捕獲外部變數,則函式體中不能修改該外部變數,否則會引發編譯錯誤。那麼有沒有辦法可以修改值捕獲的外部變數呢?這是就需要使用mutable關鍵字,該關鍵字用以說明表示式體內的**可以修改值捕獲的變數。

lambda表示式的引數和普通函式的引數類似,那麼這裡為什麼還要拿出來說一下呢?原因是在lambda表示式中傳遞引數還有一些限制,主要有以下幾點:

引數列表中不能有預設引數

不支援可變引數

所有引數必須有引數名

c 11 新特性 lambda表示式

iso c 11 標準的一大亮點是引入lambda表示式。基本語法如下 capture list parameter list return type 其中除了 其中捕獲列表可以為空 和 復合語句 相當於具名函式定義的函式體 其它都是可選的。它的型別是唯一的具有成員operator 的非聯合的類型別...

C 11新特性 lambda表示式

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

C 11新特性 lambda表示式

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