C++中Lambda表示式淺析
阿新 • • 發佈:2021-06-14
1. Lambda表示式
Lambda表示式是C++11最重要也是最常用的特性之一,是現代程式語言的一個特點,簡潔,提高了程式碼的效率並且可以使程式更加靈活
Lambda表示式就是一個匿名函式,所謂匿名函式,那自然是沒有名字的函式,當一個函式只是臨時使用而且比較簡單的時候,就可以採用Lambda表示式
Lambda表示式的語法格式如下:
當你不需要capture捕獲的時候,就直接寫一個框框
[]
當你不需要引數的時候,就直接寫一個括號()
當年不需要返回值的時候,不用寫箭頭->
和ret(返回值型別)
[capture](params) opt -> ret {body;}; - capture: 捕獲列表 - params: 引數列表 - opt: 函式選項 - ret: 返回值型別 - body: 函式體 // 示例程式碼->匿名函式的呼叫: int ret = [](int a) -> int { return a+1; }(100);
關於Lambda表示式的細節介紹:
- 捕獲列表: 捕獲一定範圍內的變數
[]
- 不捕捉任何變數[&]
- 捕獲外部作用域中所有變數, 並作為引用在函式體內使用 (按引用捕獲
)[=]
- 捕獲外部作用域中所有變數, 並作為副本在函式體內使用 (按值捕獲
)- 拷貝的副本在匿名函式體內部是隻讀的
[=, &foo]
- 按值捕獲外部作用域中所有變數, 並按照引用捕獲外部變數 foo[bar]
- 按值捕獲 bar 變數, 同時不捕獲其他變數[&bar]
- 按值捕獲 bar 變數, 同時不捕獲其他變數[this]
- 捕獲當前類中的this指標- 讓lambda表示式擁有和當前類成員函式同樣的訪問許可權
- 如果已經使用了 & 或者 =, 預設新增此選項
- 引數列表: 和普通函式的引數列表一樣
- opt 選項 -->
可以省略
- mutable: 可以修改按值傳遞進來的拷貝(注意是能修改拷貝,而不是值本身)
- exception: 指定函式丟擲的異常,如丟擲整數型別的異常,可以使用throw();
- 返回值型別:
- 標識函式返回值的型別,當返回值為void,或者函式體中只有一處return的地方(此時編譯器可以自動推斷出返回值型別)時,這部分可以省略
- 函式體:
- 函式的實現,這部分不能省略,但函式體可以為空。
2. 實列
下面實現一個最簡單的lambda表示式,沒有返回值,沒有引數
[]()
{
cout << "這是lambda表示式" <<endl;
};
以上只是定義,如果要使用的話,在函式的末尾加上引數列表,代表要傳的引數
比如這樣
[]()
{
cout << "這是lambda表示式" <<endl;
}();
這樣這個lambda表示式就會執行,如果有引數的話,底下那個括號要填引數,有返回值的話要有箭頭和返回值型別,大概基礎的部分就是這麼多。