C Lambda表示式的基本使用

2021-10-04 11:15:44 字數 2883 閱讀 9071

目錄

1.認識 lambda

1.1.捕獲列表 [ ]

1.2.形參列表 ( ) 

1.3.說明符 

1.4.返回型別 ->

1.5.函式體

2.基本使用

3.參考

lambda的基本語法如下:

當定義乙個lambda時,編譯器生成乙個與lambda對應的新的(未命名的)類型別。下面對重要的組成部分進行說明:

捕獲列表是零或多個捕獲符的逗號分隔符列表,可選地以預設捕獲符開始(僅有的預設捕獲符是 & 和 = )。預設情況下,從lambda生成的類都包含乙個對應該lambda所捕獲變數的資料成員。類似任何普通類地資料成員,lambda的資料成員也在lambda物件建立時被初始化。類似引數傳遞,變數的捕獲方式也可以是值或引用。

值捕獲:

void func()

; i = 0;

int j = f(); //j=100,因為i是建立時拷貝的

}

引用捕獲:

void func()

; i = 0;

int j = f(); //j=0,傳遞的是引用

}

除了自己列出捕獲列表的變數,還可以讓編譯器根據lambda中**來推斷我們要使用哪些變數(隱式捕獲),用過使用&或=指示編譯器推斷捕獲列表。&則採用引用捕獲的方式,=則採用值捕獲的方式。混合使用隱式捕獲和顯示捕獲,則兩者須使用不同的方式,乙個為引用捕獲,乙個為值捕獲。

lambda捕獲列表:

懸垂引用:若以引用隱式或顯式捕獲非引用實體,而在該實體的生存期結束之後呼叫lambda物件的函式呼叫運算子,則發生未定義行為。c++ 的閉包並不延長**獲的引用的生存期。這同樣適用於**獲的this指標所指向的物件的生存期。

lambda形參列表和一般的函式形參列表類似,但不允許預設實參(c++14 前)。當以 auto 為形參型別時,該 lambda 為泛型 lambda(c++14 起)。與乙個普通函式呼叫類似,呼叫乙個lambda時給定的實參被用來初始化lambda的形參。

//**在vs2019中測試

void func()

; f(i,j);

//輸出:1 20

std::cout << i << " " << j << std::endl;

}

//**在vs2019中測試

void func()

; f(1.5, 2);

f(true);

}

允許以下說明符:

預設情況下,對於乙個值被拷貝的變數,lambda不會改變其值。假如我們希望能改變乙個**獲的變數的值,就必須在引數列表後面加上關鍵字mutable。而乙個引用捕獲的變數則不受此限制。 

//**在vs2019中測試

void func()

; i = 0, j = 0;

f();

//輸出:0 100

std::cout << i << " " << j << std::endl;

}

當我們需要為乙個lambda定義返回型別時,需要使用尾置返回型別。返回型別若預設,則根據函式體中的 return 語句進行推斷(如果有多條return語句,需要保證型別一直,否則編譯器無法自動推斷)。預設情況下,如果乙個lambda函式體不包含return語句,則編譯器假定返回void。

void func()

; std::cout << f() << std::endl;

}

如果不顯示指定返回型別,則int和double兩種返回型別會導致推斷衝突。

略,同普通函式的函式體。

#include #include #include #include int main()

; int x = 5;

c.erase(std::remove_if(c.begin(), c.end(), [x](int n) ), c.end());

std::cout << "c: ";

std::for_each(c.begin(), c.end(), (int i) );

std::cout << '\n';

// 閉包的型別不能被指名,但可用 auto 提及

// c++14 起,lambda 能擁有自身的預設實參

auto func1 = (int i = 6) ;

std::cout << "func1: " << func1() << '\n';

// 與所有可呼叫物件相同,閉包能可以**獲到 std::function 之中

// (這可能帶來不必要的開銷)

std::functionfunc2 = (int i) ;

std::cout << "func2: " << func2(6) << '\n';

system("pause");

return 0;

}

輸出:

C Lambda表示式基本用法

建立乙個匿名函式並執行。objective c採用的是上尖號 而c 11採用的是配對的方括號。例項如下 include using namespace std int main 我們也可以方便的將這個建立的匿名函式賦值出來呼叫 include using namespace std int main...

lambda表示式 C Lambda表示式

lambda宣告 lambda introducer。在內部,你可以指明乙個capture用來處理外部作用域內未被傳遞為實參的資料。意味著外部作用域以by value的方式傳遞給lambda。在lamdba中不能改變其值 為什麼?意味著外部作用域以by reference的方式傳遞給lambda。因...

C lambda表示式複習

include include include include using namespace std int main lambda表示式也就是乙個函式,我們可以把它賦給函式指標,也可以在後面加上括號使用。裡面可以新增一些限制lambda塊語句中使用外部變數的限制符。一共有四種情況 1.空白表示不...