c 11之lambda表示式

2021-07-06 06:50:31 字數 1988 閱讀 6802

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

void testlambda()

); }

// 以值方式傳遞作用域內所有可見的區域性變數(包括this),輸出:11 12

);}

// 以引用方式傳遞作用域內所有可見的區域性變數(包括this),輸出:11 13 12

);cout << a << endl;

} // 以值方式傳遞區域性變數a,輸出:11 13 10

);cout << a << endl;

} // 以引用方式傳遞區域性變數a,輸出:11 13 12

);cout << a << endl;

} // 傳遞this,輸出:21 22

);}

// 除b按引用傳遞外,其他均按值傳遞,輸出:11 12 17

);cout << b << endl;

} // 操作符過載函式引數按引用傳遞,輸出:2 3

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

} // 空的lambda表示式

();{}();

private:

int m_ndata;

};

C 11之lambda表示式

lambda表示式就是匿名函式,例如 auto fun int a,int b lambda的格式如下 捕獲列表 引數 捕獲列表有下面幾種 不捕獲任何變數 捕獲外部作用域的所有變數,並作為引用在函式體內使用 按引用捕獲 捕獲外部作用域的所有變數,並作為副本在函式體內使用 按值捕獲 foo 按值捕獲外...

C 11之lambda表示式

capture parameters mutable return type1.capture 捕捉列表。捕捉列表總是出現在lambda函式的開始處。實際上,是lambda引出符。編譯器根據該引出符判斷接下來的 是否是lambda函式。捕捉列表能夠捕捉上下文中的變數以供lambda函式使用 2.pa...

c 11學習之lambda表示式

最近在專案開發過程中用到了c 11的lambda表示式,也是邊學習邊使用,下面總結下我對lambda表示式的認識。lambda表示實際是乙個函式,它的語法如下 capture parameters returntype 或者 capture parameters mutable returntype...