初探C lambda表示式

2021-10-09 16:56:44 字數 1862 閱讀 1045

目前僅僅做一下簡單的研究。

有些時候c++函式無法使用的地方,lambda表示式依然可以使用,而且更方便簡潔。

有的函式不好命名字,或者怕重名,或者懶得命名字。

將lambda表示式引入後更加簡潔,增強了**的可讀性。

引用知乎:詳細來說就是,在最適合lambda表示式的場景,如果你一定要用class表達,那麼你需要為你的類定義乙個十分臃腫的建構函式,傳進去一大堆引數,然後返回乙個值就把這個物件扔了。然而用lambda表示式的話,你只要把這些捕獲為閉包就行了。

乙個完整的lambda表示式的組成如下:

[ capture-list ]

( params )

mutable

(optional)

exception

(optional)

attribute

(optional)

->

ret(optional)

1.capture-list:捕獲列表。

2.params:和普通函式一樣的引數。

3.mutable:只有這個 lambda 表示式是 mutable 的才允許修改按值捕獲的引數。

4.exception:異常標識。

5.attribute:屬性標識。暫時不必理解。

6.ret:返回值型別,可以省略,讓編譯器通過 return 語句自動推導。

7.body:函式的具體邏輯。

或者可以簡單去看

[變數使用說明符號]

(引數列表)

-> 返回值資料型別

[

]//不捕獲任何外部變數

[x]//x 按值捕獲[&

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

]//任何外部變數都隱式按值捕獲

[x,&y]

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

, x]

//x顯式地按值捕獲. 其它變數按引用捕獲[=

,&z]

//z按引用捕獲. 其它變數按值捕獲

[this

]// 按值捕獲當前物件

值捕獲:在lambda表示建立的時候變數被拷貝,不是在呼叫的時候被拷貝;值捕獲不能改變捕獲的值,除非用mutable 允許拷貝副本被修改,mutable加在引數列表後面。

引用捕獲:可以改變外部變數; 但有可能出現懸掛引用(dangling reference)必須保證lambda 呼叫時,捕獲引用變數依然有效

它的引數列表跟普通函式的引數列表類似,主要用於接收stl演算法傳遞進來的資料,所以其引數的個數由具體的演算法決定,而引數的型別則由容器中所儲存資料的型別決定,至於引數的傳遞形式,到底是傳值還是傳引用,則由我們是否需要修改容器中的資料決定。例如,lambda表示式應用在for_each()演算法中,這就決定了它只能有乙個引數,用以接收演算法傳遞給它的單個資料;而容器中儲存的是int型別的資料,所以引數的型別也應該是int型別。至於引數的傳遞方式,如果我們需要修改容器中的資料,就使用傳引用方式,否則直接使用傳值方式。

int

main()

; std::cout <3,2)

;// >: 5

}

從引數列表開始,後面都是可選項,可根據實際情況不需要的話直接省去

int

main()

;};empty()

;// >: wow!空的~}/

lambda表示式 C Lambda表示式

lambda宣告 lambda introducer。在內部,你可以指明乙個capture用來處理外部作用域內未被傳遞為實參的資料。意味著外部作用域以by value的方式傳遞給lambda。在lamdba中不能改變其值 為什麼?意味著外部作用域以by reference的方式傳遞給lambda。因...

C lambda表示式複習

include include include include using namespace std int main lambda表示式也就是乙個函式,我們可以把它賦給函式指標,也可以在後面加上括號使用。裡面可以新增一些限制lambda塊語句中使用外部變數的限制符。一共有四種情況 1.空白表示不...

c Lambda表示式簡介

c 11標準的lambda引入的主要目的是 能夠將類似於函式的表示式用作接受函式指標或函式符的函式引數,因此,典型的lambda表示式是測試表示式或者比較表示式,可編寫為一條語句,這使得lambda簡潔而易於理解。1 乙個lambda表示式有如下型別 capture list parameter l...