C 之Lambda表示式

2021-09-24 16:37:58 字數 2173 閱讀 8625

c++ 11 中的 lambda 表示式用於定義並建立匿名的函式物件,以簡化程式設計工作。

lambda 的語法形式如下:

[函式物件引數]

(操作符過載函式引數)

mutable 或 exception 宣告

-> 返回值型別

可以看到,lambda 主要分為五個部分:[函式物件引數]、(操作符過載函式引數)、mutable 或 exception 宣告、-> 返回值型別、.

標識乙個 lambda 表示式的開始,這部分必須存在,不能省略。函式物件引數是傳遞給編譯器自動生成的函式物件類的構造

函式的。函式物件引數只能使用那些到定義 lambda 為止時 lambda 所在作用範圍內可見的區域性變數(包括 lambda 所在類

的 this)。函式物件引數有以下形式:

標識過載的 () 操作符的引數,沒有引數時,這部分可以省略。引數可以通過按值(如: (a, b))和按引用 (如: (&a, &b)) 兩種

方式進行傳遞。

這部分可以省略。按值傳遞函式物件引數時,加上 mutable 修飾符後,可以修改傳遞進來的拷貝(注意是能修改拷貝,而不是

值本身)。exception 宣告用於指定函式丟擲的異常,如丟擲整數型別的異常,可以使用 throw(int)。

標識函式返回值的型別,當返回值為 void,或者函式體中只有一處 return 的地方(此時編譯器可以自動推斷出返回值型別)

時,這部分可以省略。

標識函式的實現,這部分不能省略,但函式體可以為空。

(int x, int y)  // 隱式返回型別

(int& x) // 沒有 return 語句 -> lambda 函式的返回型別是 'void'

() // 沒有引數,僅訪問某個全域性變數

// 與上乙個相同,省略了 (操作符過載函式引數)

可以像下面這樣顯示指定返回型別:

(int x, int y) -> int
在這個例子中建立了乙個臨時變數 z 來儲存中間值。和普通函式一樣,這個中間值不會儲存到下次呼叫。什麼也不返回的

lambda 函式可以省略返回型別,而不需要使用 -> void 形式。

lambda 函式可以引用在它之外宣告的變數. 這些變數的集合叫做乙個閉包. 閉包被定義在 lambda 表示式宣告中的方括

號 內。這個機制允許這些變數被按值或按引用捕獲。如下圖的例子:

//未定義變數,檢視在lambda內使用任何外部變數都是錯誤的

[x,&y] //x按值捕獲,y按引用捕獲

[&] //用到的任何外部變數都隱式按引用捕獲

[=] //用到的任何外部變數都隱式按值捕獲

[&,x] //x顯示的按值捕獲,其他變數按引用捕獲

[=,&z] //z按引用捕獲,其他變數按值捕獲

std::vectorsome_list;

int total = 0;

for (int i = 0; i < 5; ++i) some_list.push_back(i);

std::for_each(begin(some_list), end(some_list), [&total](int x));

此例計算 list 中所有元素的總和。變數 total 被存為 lambda 函式閉包的一部分。因為它是棧變數(區域性變數)total 引

用,所以可以改變它的值。

std::vectorsome_list;

int total = 0;

int value = 5;

std::for_each(begin(some_list), end(some_list), [&, value, this](int x)

);

此例中 total 會存為引用, value 則會存乙份值拷貝。對 this 的捕獲比較特殊,它只能按值捕獲。this 只有當包含它的最靠近

它的函式不是靜態成員函式時才能**獲。對 protect 和 private 成員來說,這個 lambda 函式與建立它的成員函式有相同

的訪問控制。如果 this **獲了,不管是顯式還是隱式的,那麼它的類的作用域對 lambda 函式就是可見的。訪問 this 的

成員不必使用 this-> 語法,可以直接訪問。

C 之lambda表示式

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

c 之Lambda 表示式

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

c 之lambda 表示式

也叫做lambda 函式,lambda 表示式的出現目的是為了提高編碼效率,但是它的語法卻顯得有點複雜。lambda表示式表示乙個可以執行的 單元,可以理解為乙個未命名的內聯函式。1.lambda表示式的語法在編寫lambda表示式的時候,可以忽略引數列表和返回值型別,但是前後的捕獲列表和函式體必須...