C++11中的Lambda表達(dá)式用于 定義并創(chuàng)建匿名的函數(shù)對象 ,以簡化編程工作。下面看一下Lambda表達(dá)式的基本構(gòu)成。
基本構(gòu)成
首先是Lambda的基本結(jié)構(gòu):
capture mutable ->return-type
{
statement
}
整體的結(jié)構(gòu)可以表示為:函數(shù)對象參數(shù)mutable ->返回值{函數(shù)體}。下面依次介紹各個部分的定義及用法。
函數(shù)對象參數(shù)
[] ,用這個方括號標(biāo)識一個Lambda表達(dá)式的開始,這一部分 必須存在,不能省略 。函數(shù)對象參數(shù)是傳遞給編譯器自動生成的函數(shù)對象類的構(gòu)造函數(shù)的。函數(shù)對象參數(shù)只能使用那些到定義Lambda為止時Lambda所在作用范圍內(nèi)可見的 局部變量 (包括Lambda所在類的this)。
int a=1;
[](){
cout<endl;
}();
在這個例子中,函數(shù)對象為空,訪問不到a,程序會報錯。(最后加一個括號是直接調(diào)用)函數(shù)對象參數(shù)有以下形式:
- 空。沒有使用任何函數(shù)對象參數(shù)。
- =。函數(shù)體內(nèi)可以使用Lambda所在作用范圍內(nèi)所有可見的局部變量(包括Lambda所在類的this),并且是 值傳遞方式 (相當(dāng)于編譯器自動為我們按值傳遞了所有局部變量)。 這種方式最為常用 。
- &。函數(shù)體內(nèi)可以使用Lambda所在作用范圍內(nèi)所有可見的局部變量(包括Lambda所在類的this),并且是 引用傳遞方式 (相當(dāng)于編譯器自動為我們按引用傳遞了所有局部變量)。
- this。函數(shù)體內(nèi)可以使用Lambda所在類中的成員變量。
- a。將a按值進(jìn)行傳遞。按值進(jìn)行傳遞時,函數(shù)體內(nèi)不能修改傳遞進(jìn)來的a的拷貝,因為默認(rèn)情況下函數(shù)是const的。要修改傳遞進(jìn)來的a的拷貝,可以添加mutable修飾符。
- &a。將a按引用進(jìn)行傳遞。=,&a, &b。除a和b按引用進(jìn)行傳遞外,其他參數(shù)都按值進(jìn)行傳遞。? &, a, b。除a和b按值進(jìn)行傳遞外,其他參數(shù)都按引用進(jìn)行傳遞。
常用的方式就第二種和第三種。其它的方式根據(jù)具體的情況進(jìn)行選擇。
操作符重載函數(shù)參數(shù)
標(biāo)識重載的()操作符的參數(shù),沒有參數(shù)時,這部分可以省略。參數(shù)可以通過按值(如:(a,b))和按引用(如:(&a,&b))兩種方式進(jìn)行傳遞。這個就類似與普通函數(shù)的形參。
可修改標(biāo)示符
mutable聲明,這部分可以省略。按值傳遞函數(shù)對象參數(shù)時,加上mutable修飾符后,可以修改按值傳遞進(jìn)來的拷貝(注意是能修改拷貝,而不是值本身)。
int a=1;
//不可修改
[=](){
a=2;
}();
//可以修改
[=]()mutable{
a=2;
}();
只是對值的拷貝進(jìn)行修改,函數(shù)外部變量的值仍未改變。
函數(shù)返回值
->返回值類型,標(biāo)識函數(shù)返回值的類型,當(dāng)返回值為void,或者函數(shù)體中只有一處return的地方(此時編譯器可以自動推斷出返回值類型)時,這部分可以省略。
函數(shù)體
{},標(biāo)識函數(shù)的實現(xiàn),這部分不能省略,但函數(shù)體可以為空。
Lambda作為返回值
在C++11中只能使用std::function指定返回值,將欲返回的lambda表達(dá)式轉(zhuǎn)換成function對象。
auto num = [](int i, int j){ return i - j; };
int main(){
cout<1,2);
}
上述是將Lambda作為一個對象,然后用auto自動轉(zhuǎn)換類型,同時可以指定類型也就是function對象。
function<int(int,int)> num = [](int i, int j){ return i - j; };
cout<1,2);
這個模板對象中需要傳入函數(shù)返回值類型和形參類型,通常使用auto進(jìn)行自動轉(zhuǎn)換。
std::function<void(int)> func(){
return [] (int e) { std::cout << e; };
}
func()(10);
這個例子是將Lambda作為函數(shù)的返回值。
總結(jié)
Lambda還有許多種用處,通常也可以作為STL種算法的參數(shù)傳入,用于處理一些邏輯較為簡單的函數(shù)結(jié)構(gòu),例如比較大小等。
std::sort(v.begin(), v.end(), [] ( int n1, int n2 ) { return n1 > n2; });
這個例子就是用sort算法,并利用Lambda進(jìn)行排序。
審核編輯:湯梓紅
-
函數(shù)
+關(guān)注
關(guān)注
3文章
4304瀏覽量
62429 -
C++
+關(guān)注
關(guān)注
22文章
2104瀏覽量
73489 -
Lambda
+關(guān)注
關(guān)注
0文章
28瀏覽量
9859
發(fā)布評論請先 登錄
相關(guān)推薦
評論