C 11之lambda表示式

2021-08-20 09:05:15 字數 2046 閱讀 4637

[capture](parameters) mutable ->return-type
1.[capture]:捕捉列表。捕捉列表總是出現在lambda函式的開始處。實際上,是lambda引出符。編譯器根據該引出符判斷接下來的**是否是lambda函式。捕捉列表能夠捕捉上下文中的變數以供lambda函式使用;

2.(parameters):引數列表。與普通函式的引數列表一致。如果不需要引數傳遞,則可以連同括號「()」一起省略;

3.mutable:mutable修飾符。預設情況下,lambda函式總是乙個const函式,mutable可以取消其常量性。在使用該修飾符時,引數列表不可省略(即使引數為空);

4.->return-type:返回型別。用追蹤返回型別形式宣告函式的返回型別。我們可以在不需要返回值的時候也可以連同符號」->」一起省略。此外,在返回型別明確的情況下,也可以省略該部分,讓編譯器對返回型別進行推導;

5.:函式體。內容與普通函式一樣,不過除了可以使用引數之外,還可以使用所有捕獲的變數。

與普通函式最大的區別是,除了可以使用引數以外,lambda函式還可以通過捕獲列表訪問一些上下文中的資料。具體地,捕捉列表描述了上下文中哪些資料可以被lambda使用,以及使用方式(以值傳遞的方式或引用傳遞的方式)。語法上,在「」包括起來的是捕捉列表,捕捉列表由多個捕捉項組成,並以逗號分隔。捕捉列表有以下幾種形式:

1.[var]表示值傳遞方式捕捉變數var;

2.[=]表示值傳遞方式捕捉所有父作用域的變數(包括this);

3.[&var]表示引用傳遞捕捉變數var;

4.[&]表示引用傳遞方式捕捉所有父作用域的變數(包括this);

5.[this]表示值傳遞方式捕捉當前的this指標。

上面提到了乙個父作用域,也就是包含lambda函式的語句塊,說通俗點就是包含lambda的「{}」**塊。上面的捕捉列表還可以進行組合,例如:

1.[=,&a,&b]表示以引用傳遞的方式捕捉變數a和b,以值傳遞方式捕捉其它所有變數;

2.[&,a,this]表示以值傳遞的方式捕捉變數a和this,引用傳遞方式捕捉其它所有變數。

不過值得注意的是,捕捉列表不允許變數重複傳遞。下面一些例子就是典型的重複,會導致編譯時期的錯誤。例如:

3.[=,a]這裡已經以值傳遞方式捕捉了所有變數,但是重複捕捉a了,會報錯的;

4.[&,&this]這裡&已經以引用傳遞方式捕捉了所有變數,再捕捉this也是一種重複。

// lambda.cpp : 定義控制台應用程式的入口點。

//#include "stdafx.h"

#include using namespace std;

typedef enum

type;

/* [capture](parameters) mutable ->return-type */

int _tmain(int argc, _tchar* argv)

}; std::cout << func(mul) << std::endl;

int val = 0;

// auto const_val_lambda = [=](); wrong!!!

/* const修飾的成員函式體,內部不允許修改非靜態變數,而lambda函式預設有const修飾,mutable可以取消const */

auto mutable_val_lambda = [=]() mutable;

mutable_val_lambda();

cout << val << endl; // 0

/* 以引用方式傳值,可以改變,相當於不改變引用本身,改變引用的值, */

auto const_ref_lambda = [&]() ;

const_ref_lambda();

cout << val << endl; // 4

auto mutable_ref_lambda = [&]() mutable;

mutable_ref_lambda();

cout << val << endl; // 5

return 0;

}

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表示式

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