c 11學習之lambda表示式

2021-10-09 14:32:46 字數 1570 閱讀 5959

最近在專案開發過程中用到了c++11的lambda表示式,也是邊學習邊使用,下面總結下我對lambda表示式的認識。

lambda表示實際是乙個函式,它的語法如下:

[capture](parameters) ->returntype 或者

[capture](parameters) mutable ->returntype

1.[capture]捕獲列表,其中引數列表可以有多種形式,以逗號做為分割,捕獲列表捕獲上下文的變數以供lambda表示式使用

表示不捕獲任何變數(包括this指標);

[=]以值傳遞方式捕獲上下文的所有變數(包括this指標);

[&]以引用傳遞方式捕獲上下文的所有變數;

[=,&a,&b]以引用傳遞方式捕獲變數a和變數b,以值傳遞方式捕獲上下文中的其它變數;

[&,a,b]以值傳遞方式捕獲變數a和變數b,以引用傳遞方式捕獲上下文的其它變數;

[this]表示值傳遞方式捕獲this指標;

另外需要注意不能出現一下兩種情況,否則程式會報錯:

[&,&a]以引用捕獲方式捕獲了所有變數,但是重複捕獲了變數a,程式會報錯;

[=,&b]以值傳遞捕獲方式捕獲了所有變數,但是重複捕獲了變數b,程式依然會報錯;

2.(parameters):引數列表,跟普通函式的引數列表一樣,如果不需要傳遞任何引數,則可以為空(當然可以連同"()"一起省略)

3.mutable:mutable修飾符,預設情況下,lambda表示式是乙個const函式,可以通過mutable修飾符來取消其const屬性

4.->returntype:返回型別,在函式返回值明確的情況下,可以省略該部分,讓編譯器自動進行型別推導;在不需要函式返回值的情況下,可以將"->"一同省略

5.:函式體,跟普通函式的函式體一樣,不過它不僅可以可以使用引數列表的引數,還可以使用捕獲的所有變數

下面來看乙個lambda表示式的例子:

#include

using namespace std;

int main()

;//唯讀,編譯時程式會報錯

//cout << by_variable_lambda() << endl;

auto mutable_variable_lambda = [=]() mutable;

cout << mutable_variable_lambda() << endl;

auto const_reference_lambda = [&]() ;

cout << const_reference_lambda() << endl;

auto mutable_reference_lambda = [&]() mutable ;

cout << mutable_reference_lambda() << endl;

return 0;

}另外,使用lambda表示式的乙個原因,是建立了乙個希望接受lambda函式的函式,其中std::function是傳遞lambda函式的最好方式,下面是專案中使用lambda表示式的部分**

#include

#include

using task = std::function;

c 11之lambda表示式

c 11中的lambda表示式用於定義並建立匿名的函式物件,以簡化程式設計工作。lambda的語法形式如下 函式物件引數 操作符過載函式引數 mutable或exception宣告 返回值型別 可以看到,lambda主要分為五個部分 函式物件引數 操作符過載函式引數 mutable或exceptio...

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...