C 11 lambda表示式 詳解

2021-07-25 08:47:12 字數 1863 閱讀 9801

如下圖,lambda表示式由下面幾個部分構成:

c++11 的 lambda 表示式規範如下:

mutable 修飾符說明 lambda 表示式體內的**可以修改**獲的變數,並且可以訪問**獲物件的 non-const 方法。

exception 說明 lambda 表示式是否丟擲異常(noexcept),以及丟擲何種異常,類似於void f() throw(x, y)。

attribute 用來宣告屬性。

另外,capture 指定了在可見域範圍內 lambda 表示式的**內可見得外部變數的列表,具體解釋如下:

int a = 1;

int b = 2;

auto func = [=, &b](int c)->int ;

關於capture 中值[=]和引用[&]的區別下面是其它人部落格中看到一些容易出錯的lambda的用法:

#include

using

namespace

std;

int main()

; auto by_ref_lambda = [&];

cout

<

/ 11

cout

<

/ 11

++j;

cout

<

/ 11

cout

<

/ 12

return

0;

}

第三個輸出為什麼不是12呢?

在by_val_lambda中,j被視為乙個常量,一旦初始化後不會再改變(可以認為之後只是乙個跟父作用域中j同名的常量),

而在by_ref_lambda中,j仍然在使用父作用域中的值。

所以,在使用lambda函式的時候,如果需要捕捉的值成為lambda函式的常量,我們通常會使用按值傳遞的方式捕捉;

相反的,如果需要捕捉的值成成為lambda函式執行時的變數,則應該採用按引用方式進行捕捉。

關於 mutable 的深度理解

預設情況下,lambda函式總是乙個const函式,mutable可以取消其常量性。按照規定,乙個const的成員函式是不能在函式體內修改非靜態成員變數的值

#include

using

namespace

std;

int main()

; wrong!!!

auto mutable_val_lambda = [=]() mutable;

mutable_val_lambda();

cout

/ 0// 而對於引用的傳遞方式,並不會改變引用本身,而只會改變引用的值,因此就不會報錯了

auto const_ref_lambda = [&]() ;

const_ref_lambda();

cout

/ 4auto mutable_ref_lambda = [&]() mutable;

mutable_ref_lambda();

cout

/ 5return

0;

}

C 11 lambda 表示式解析

中括號中 from 下面是各種變數擷取的選項 小括號中,就是函式引數 lambda表示式可以作為其它函式引數 1 標準格式 有箭頭 就要顯示寫明返回值型別 auto pfunc1 this void pfunc1 2 簡化格式 void 型別返回值 沒有箭頭 會預設檢測返回值型別 auto pfun...

C 11 Lambda表示式簡介

lambda簡介 capture列表 mutable說明 c 11中的lambda 表示式用於定義並建立匿名的函式物件,以簡化程式設計工作。lambda表示式一般都是從方括號開始,然後結束於花括號 主要包括五個部分 常見幾種lambda表示式形式 表示式 capture params mutable...

C 11 lambda表示式小結

目錄problems lambda表示式是乙個匿名內聯函式,可以定義別的函式體中,其形式如下 capture list parameter list return type從中可以看到,lambda只能使用尾置返回型別 尾置返回型別放在引數列表後邊以 開頭,然後再原來放返回型別的地方放乙個auto。...