C 匿名函式

2022-05-05 07:09:11 字數 1585 閱讀 3284

1.匿名函式的基本語法為:

//

[捕獲列表](引數列表)->返回型別

intmain()

; std::cout

<< add(1, 2) << std::endl; //

輸出3return0;

}

一般情況下,編譯器可以自動推斷出lambda表示式的返回型別,所以我們可以不指定返回型別,即:

//

[捕獲列表](引數列表)

intmain()

; std::cout

<< add(1, 2) << std::endl; //

輸出3return0;

}

但是如果函式體內有多個return語句時,編譯器無法自動推斷出返回型別,此時必須指定返回型別。

2.捕獲列表

有時候,需要在匿名函式內使用外部變數,所以用捕獲列表來傳參,如

int

main()

; std::cout

<< add(1, 2)

}

但是,如果add中加入一句:c = a;

int

main()

; 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表示式 ...