前言
大家好吖,歡迎來到 YY 滴C++系列 ,熱烈歡迎! 本章主要內(nèi)容面向接觸過C++的老鐵
主要內(nèi)容含:
歡迎訂閱 YY滴C++專欄!更多干貨持續(xù)更新!以下是傳送門!文章來源:http://www.zghlxwxcb.cn/news/detail-769940.html
- YY的《C++》專欄
- YY的《C++11》專欄
- YY的《Linux》專欄
- YY的《數(shù)據(jù)結(jié)構(gòu)》專欄
- YY的《C語言基礎(chǔ)》專欄
- YY的《初學者易錯點》專欄
- YY的《小小知識點》專欄
一.lambda表達式語法
1)lambda表達式總覽
lambda表達式書寫格式:[capture-list] (parameters) mutable -> return-type { statement }文章來源地址http://www.zghlxwxcb.cn/news/detail-769940.html
- lambda表達式各部分說明
[capture-list] : 捕捉列表,該列表總是出現(xiàn)在lambda函數(shù)的開始位置,編譯器根據(jù)[]來判斷接下來的代碼是否為lambda函數(shù),捕捉列表能夠捕捉上下文中的變量供lambda函數(shù)使用。
- (parameters):參數(shù)列表。與普通函數(shù)的參數(shù)列表一致,如果不需要參數(shù)傳遞,則可以連同()一起省略
- mutable:默認情況下,lambda函數(shù)總是一個const函數(shù),mutable可以取消其常量性。使用該修飾符時,參數(shù)列表不可省略(即使參數(shù)為空)。
- ->returntype:返回值類型。用追蹤返回類型形式聲明函數(shù)的返回值類型,沒有返回值時此部分可省略。返回值類型明確情況下,也可省略,由編譯器對返回類型進行推導。
- {statement}:函數(shù)體。在該函數(shù)體內(nèi),除了可以使用其參數(shù)外,還可以使用所有捕獲到的變量。
- 在lambda函數(shù)定義中,參數(shù)列表和返回值類型都是可選部分,而捕捉列表和函數(shù)體可以為空。因此C++11中最簡單的lambda函數(shù)為:[]{}; 該lambda函數(shù)不能做任何事情。
2) lambda的返回值類型一般可以省略
- ->returntype:返回值類型。
- 用追蹤返回類型形式聲明函數(shù)的返回值類型,沒有返回值時此部分可省略。返回值類型明確情況下,也可省略,由編譯器對返回類型進行推導。
int main()
{
int a = 0, b = 2;
double rate = 2.555;
auto add1 = [](int x, int y)->int {return x + y; };
auto add2 = [](int x, int y) {return x + y; };//返回值類型明確情況下,也可省略,由編譯器對返回類型進行推導。
}
3) 捕捉列表能夠捕捉上下文中的變量供lambda函數(shù)使用
- 下面代碼需要捕捉rate變量給后面函數(shù)體用
auto add3 = [rate](int x, int y) {return (x + y)* rate; };
4) 捕捉列表【特殊使用方式】一覽
- [var]:表示值傳遞方式捕捉變量var
- [=]:表示值傳遞方式捕獲所有父作用域中的變量(包括this)
- [&var]:表示引用傳遞捕捉變量var
- [&]:表示引用傳遞捕捉所有父作用域中的變量(包括this)
- [this]:表示值傳遞方式捕捉當前的this指針
- 以下為 [&] 演示+ [&,a] 演示
int a = 0;
int b = 1;
int c = 2;
int d = 3;
const int e = 1;
cout << &e << endl;
// 引用的方式捕捉所有對象,除了a
// a用傳值的方式捕捉
//捕捉所有對象auto func = [&]{函數(shù)體};
auto func = [&, a] {
//a++;fail
b++;
c++;
d++;
//e++;
cout << &e << endl;
5) mutable在【傳值傳參】時的用法
- 默認情況下,lambda函數(shù)總是一個const函數(shù),mutable可以取消其常量性。使用該修飾符時,參數(shù)列表不可省略(即使參數(shù)為空)
//這里程序是會報錯的,可以這樣理解:因為其參數(shù)默認是帶const的,不能被修改
int x = 0, y = 2;
auto swap1 = [add1](int& x, int& y) {
int tmp = x;
x = y;
y = tmp;
cout << add1(x, y) << endl;
};
swap1(a, b);
int x = 0, y = 2;
auto swap1 = [x, y]() mutable {
// mutable讓捕捉的x和y可以改變了,
// 但是他們依舊是外面x和y的拷貝
int tmp = x;
x = y;
y = tmp;
};
swap1();
6)lambda在實現(xiàn)交換函數(shù)swap()時常用【傳引用傳參】而不是【傳值傳參+mutable】
- 在小點4中,我們是用下面代碼實現(xiàn)swap()
int x = 0, y = 2;
auto swap1 = [x, y]() mutable {
// mutable讓捕捉的x和y可以改變了,
// 但是他們依舊是外面x和y的拷貝
int tmp = x;
x = y;
y = tmp;
};
swap1();
- 但是這一回略顯繁瑣,我們一般用【傳引用傳參】而不是【傳值傳參+mutable】,如下所示:
// 引用的方式捕捉
int x = 0, y = 2;
auto swap2 = [&x, &y](){
int tmp = x;
x = y;
y = tmp;
};
swap2();
到了這里,關(guān)于【C++】lambda表達式語法詳細解讀(代碼演示,要點解析)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!