C 11 新特性之Lambda表示式

2021-08-04 16:00:11 字數 3463 閱讀 9533

一、lambda表示式

c++ 11中的

lambda

表示式用於定義並建立匿名的函式物件,以簡化程式設計工作。

lambda

的語法形式如下:

[函式物件引數

] (操作符過載函式引數

) mutable

或exception

宣告 ->

返回值型別

可以看到,lambda主要分為五個部分:

[函式物件引數]、

(操作符過載函式引數)、

mutable

或exception

宣告、->

返回值型別、

。下面分別進行介紹。

一、[函式物件引數

],標識乙個

lambda

的開始,這部分必須存在,不能省略。函式物件引數是傳遞給編譯器自動生成的函式物件類的建構函式的。函式物件引數只能使用那些到定義

lambda

為止時lambda

所在作用範圍內可見的區域性變數(包括

lambda

所在類的

this

)。函式物件引數有以下形式:

1、空。沒有使用任何函式物件引數。 2、

=。函式體內可以使用

lambda

所在作用範圍內所有可見的區域性變數(包括

lambda

所在類的

this

),並且是值傳遞方式(相當於編譯器自動為我們按值傳遞了所有區域性變數)。3、&

。函式體內可以使用

lambda

所在作用範圍內所有可見的區域性變數(包括

lambda

所在類的

this

),並且是引用傳遞方式(相當於編譯器自動為我們按引用傳遞了所有區域性變數)。

4、this

。函式體內可以使用

lambda

所在類中的成員變數。5、a

。將a按值進行傳遞。按值進行傳遞時,函式體內不能修改傳遞進來的

a的拷貝,因為預設情況下函式是

const

的。要修改傳遞進來的

a的拷貝,可以新增

mutable

修飾符。 6、

&a。將

a按引用進行傳遞。 7、

a, &b。將a

按值進行傳遞,

b按引用進行傳遞。 8、

=,&a, &b。除a

和b按引用進行傳遞外,其他引數都按值進行傳遞。 9、

&, a, b。除a

和b按值進行傳遞外,其他引數都按引用進行傳遞。

二、(操作符過載函式引數

),標識過載的

()操作符的引數,沒有引數時,這部分可以省略。引數可以通過按值(如:

(a,b)

)和按引用(如:

(&a,&b)

)兩種方式進行傳遞。

三、mutable或

exception

宣告,這部分可以省略。按值傳遞函式物件引數時,加上

mutable

修飾符後,可以修改按值傳遞進來的拷貝(注意是能修改拷貝,而不是值本身)。

exception

宣告用於指定函式丟擲的異常,如丟擲整數型別的異常,可以使用

throw(int)。

四、->返回值型別,標識函式返回值的型別,當返回值為

void

,或者函式體中只有一處

return

的地方(此時編譯器可以自動推斷出返回值型別)時,這部分可以省略。 五、

,標識函式的實現,這部分不能省略,但函式體可以為空。

下面給出乙個例子:

class ctest

public:  

ctest() : m_ndata(20)  

void testlambda()  

vectorvcttemp;  

vcttemp.push_back(1);  

vcttemp.push_back(2);     

// 無函式物件引數,輸出:

1 2  

for_each(vcttemp.begin(), vcttemp.end(), (int v));  

// 以

值方式傳遞作用域內

所有可見的區域性變數(包括this),輸出:

11 12  

int a = 10;  

for_each(vcttemp.begin(), vcttemp.end(), [=](int v));  

// 以

引用方式傳遞作用域內

所有可見的區域性變數(包括this),輸出:

11 13 12  

int a = 10;  

for_each(vcttemp.begin(), vcttemp.end(), [&](int v)mutable);  

cout << a << endl;  

// 以

值方式傳遞區域性變數a

,輸出:11 13 10  

int a = 10;  

//注意:在

lambda

表示式中的

a 只是乙個拷貝,新增

mutable

之後,可以修改

a的值,但只是修改拷貝的

a  

for_each(vcttemp.begin(), vcttemp.end(), [a](int v)mutable);  

cout << a << endl;  

// 以

引用方式傳遞區域性變數a

,輸出:11 13 12  

int a = 10;  

for_each(vcttemp.begin(), vcttemp.end(), [&a](int v));  

cout << a << endl;  

// 傳遞this

,輸出:21 22  

for_each(vcttemp.begin(), vcttemp.end(), [this](int v));  

// 除

b按引用傳遞外,其他均按值傳遞

,輸出:11 12 17  

int a = 10;  

int b = 15;  

for_each(vcttemp.begin(), vcttemp.end(),[=,&b](int v));  

cout << b << endl;  

// 操作符過載函式引數按值傳遞

,輸出:1 2  

for_each(vcttemp.begin(), vcttemp.end(), (int v));  

// 操作符過載函式引數按引用傳遞

,輸出:2 3  

for_each(vcttemp.begin(), vcttemp.end(), (int &v){ v++; coutlambda

表示式  

private:  

int m_ndata;  

C 11 新特性之 lambda

這是c 11新特性介紹的第三部分,涉及到c 11這次更新中較為重要的lambda表示式。不想看toy code的讀者可以直接拉到文章最後看這部分的總結。熟悉python的程式設計師應該對lambda不陌生。簡單來說,lambda就是乙個匿名的可呼叫 塊。在c 11新標準中,lambda具有如下格式 ...

c 11 新特性 lambda表示式

iso c 11 標準的一大亮點是引入lambda表示式。基本語法如下 capture list parameter list return type 其中除了 其中捕獲列表可以為空 和 復合語句 相當於具名函式定義的函式體 其它都是可選的。它的型別是唯一的具有成員operator 的非聯合的類型別...

C 11新特性 lambda表示式

為何要寫一篇博文呢?其實,系統學了c 一定會學到lambda表示式。不巧不巧,在秋招的浪潮中,我又被問到了關於lambda表示式,回過頭想一想,其實lambda表示式在c 中應用挺廣泛的。匿名函式,短小精悍,應該就是它的feature。好記性不如爛筆頭,書上有路勤為徑。可呼叫物件 對於任何乙個物件或...