1.匿名函式的基本語法為:
//[捕獲列表](引數列表)->返回型別
intmain()
; std::cout
<< add(1, 2) << std::endl; //
輸出3return0;
}
一般情況下,編譯器可以自動推斷出lambda表示式的返回型別,所以我們可以不指定返回型別,即:
//[捕獲列表](引數列表)
intmain()
; std::cout
<< add(1, 2) << std::endl; //
輸出3return0;
}
但是如果函式體內有多個return語句時,編譯器無法自動推斷出返回型別,此時必須指定返回型別。
2.捕獲列表
有時候,需要在匿名函式內使用外部變數,所以用捕獲列表來傳參,如
intmain()
; std::cout
<< add(1, 2)
}
但是,如果add中加入一句:c = a;
intmain()
; std::cout
<< add(1, 2)
}
補充知識:
1.如果捕獲列表為[&],則表示所有的外部變數都按引用傳遞給lambda使用;
2.如果捕獲列表為[=],則表示所有的外部變數都按值傳遞給lambda使用;
3.匿名函式構建的時候對於按值傳遞的捕獲列表,會立即將當前可以取到的值拷貝乙份作為常數,然後將該常數作為引數傳遞。
3.匿名函式的簡寫
匿名函式由捕獲列表、引數列表、返回型別和函式體組成;可以忽略引數列表和返回型別,但不可以忽略捕獲列表和函式體
如:
auto f = ;
4.lambda捕獲列表
空捕獲列表,lambda不能使用所在函式中的變數。
[names]
names是乙個逗號分隔的名字列表,這些名字都是lambda所在函式的區域性變數。預設情況下,這些變數會被拷貝,然後按值傳遞,名字前面如果使用了&,則按引用傳遞
[&]隱式捕獲列表,lambda體內使用的區域性變數都按引用方式傳遞
[=]隱式捕獲列表,lanbda體內使用的區域性變數都按值傳遞
[&,identifier_list]
identifier_list是乙個逗號分隔的列表,包含0個或多個來自所在函式的變數,這些變數採用值捕獲的方式,其他變數則被隱式捕獲,採用引用方式傳遞,identifier_list中的名字前面不能使用&。
[=,identifier_list]
identifier_list中的變數採用引用方式捕獲,而被隱式捕獲的變數都採用按值傳遞的方式捕獲。identifier_list中的名字不能包含this,且這些名字面前必須使用&。
(參考部落格:感謝分享)
C 匿名函式
所謂匿名函式,其實類似於python中的lambda函式,其實就是沒有名字的函式。使用匿名函式,可以免去函式的宣告和定義。這樣匿名函式僅在呼叫函式的時候才會建立函式物件,而呼叫結束後立即釋放,所以匿名函式比非匿名函式更節省空間 c 中的匿名函式通常為 capture parameters retur...
C 匿名函式
匿名函式是乙個 內聯 語句或表示式,可在需要委託型別的任何地方使用。可以使用匿名函式來初始化命名委託,或傳遞命名委託 而不是命名委託型別 作為方法引數。c 中委託的發展 在 c 1.0 中,您通過使用在 中其他位置定義的方法顯式初始化委託來建立委託的例項。c 2.0 引入了匿名方法的概念,作為一種編...
C 匿名函式
c 中委託的演變 c 1 中,通過使用在 中其他位置定義的方法顯式初始化委託來建立委託的例項 c 2中,引入了匿名方法的概念,作為一種編寫可在委託呼叫中執行的未命名內聯句塊的方式 c 3 中,引入了lambda 表示式,這種表示式和匿名方法類似,但更具表達力 更簡單。匿名方法 和lambda表示式 ...