c 1 新特性 lambda表示式

2022-03-18 03:02:19 字數 2952 閱讀 5784

從c++11開始,可以使用lambda表示式,介紹一下使用方法以及事項, 你可以把它當作乙個無名過載了operator()運算子的類物件。

目錄lambda表示式

使用mutable關鍵字修飾的lambda

c++11標準中,引入定義函式時的一種新的方法,使用尾置返回型別.這種形式對於返回型別比較複雜的情況很有效。

通常情況下,我們定義或宣告乙個函式時,是這樣的:

int add(int a, int b);
尾置返回型別的定義是這樣的:

auto add(int a, int b) -> int;
當我們定義乙個返回指向10個元素的int陣列指標的函式時,按正常形式是這樣的:

int (*func())[10];
當我們使用尾置返回型別時,它是這樣的:

auto func() -> int(*)[10];
lambda採用尾置返回型別,它完整的const宣告形式為:(引數列表) -> 返回值型別, const是指在捕獲列表內通過值捕獲的引數在lambda內部是不可以改變的。

int func(vectorarray)

std::sort(array.begin(), array.end(), func);

}void sample ()

; // 編譯錯誤, 變數a的型別在lambda體內為const的。

auto func2 = [a] () mutable ; // 沒有問題

auto func3 = [&a] () ; // 沒有問題

}

引數列表與返回值型別可以根據是否需要,進行省略掉, 規則如下:

捕獲列表只需要捕獲lambda所在作用域內常規的區域性變數,對於非區域性變數以及區域性的靜態變數不需要捕獲,可以直接使用。 例如:

int g_value = 100;

void sample()

;}

值捕獲

方式一:使用[=]隱式捕獲lambda內所有使用到的變數的值。

方式二:使用[val1, val2, val3, ...]顯示捕獲lambda內使用到的變數的值。

void sample()

; auto func2 = [value1, value2, value3] () ;

}

引用捕獲

方式一:使用[&]隱式捕獲lambda內所有使用到的變數的值。

方式二:使用[&val1, &val2, &val3, ...]顯示捕獲lambda內使用到的變數的值。

void sample()

; auto func2 = [&value1, &value2, &value3] () ;

}

混合捕獲

方式一:使用[val1, &val2, val3, ...]隨意的組合值捕獲和引用捕獲來獲取lambda內使用到的變數的值。

方式二:使用[=, &val1, &val2, ...]表示除了手動指出來的變數通過引用捕獲之外,其它的變數都是通過值進行捕獲。

方式三:使用[&, val1, val2, ...]表示除了手動指出來的變數通過值捕獲之外,其它的變數都是通過引用進行捕獲。

void sample()

; auto func2 = [=, &value2] () ;

auto func3 = [&, value3] () ;

}

注意事項:

當lambda表示式定義在類內的成員函式時,如果在lambda表示式內部要訪問類的成員函式或成員變數(無論public/protected/private)時,要麼顯示捕獲this指標,要麼通過[=]或[&]進行隱式捕獲。

使用引用捕獲時,特別注意這些引數實體的生存期,保證呼叫lambda時這些實體是有意義的,避免懸垂引用的產生。

預設的lamba的宣告方式是const宣告,通過值獲取的引數在lambda內是無法修改的,如果要改變該值,在引數列表後面加上mutable關鍵字。

void sample ()

; // 編譯錯誤

auto func2 = [a] () mutable ; // 沒有問題

}

ret-type operator() (引數列表) const      // 未使用關鍵字mutable時,預設情況

ret-type operator() (引數列表) // 使用了mutable 關鍵字時

mutable 關鍵字只對值捕獲引數有影響,對引用捕獲的引數無影響。原因是:引用引數能否修改為引數本身是否為const型別決定。即使乙個類的成員函式有 const 宣告(該const就是修改this指標的),照樣可以通過該成員函式修改乙個引用型別的成員變數,例如:

class test 

void increase() const

private:

int& a;

};

c 11 新特性 lambda表示式

iso c 11 標準的一大亮點是引入lambda表示式。基本語法如下 capture list parameter list return type 其中除了 其中捕獲列表可以為空 和 復合語句 相當於具名函式定義的函式體 其它都是可選的。它的型別是唯一的具有成員operator 的非聯合的類型別...

C 11新特性 lambda表示式

為何要寫一篇博文呢?其實,系統學了c 一定會學到lambda表示式。不巧不巧,在秋招的浪潮中,我又被問到了關於lambda表示式,回過頭想一想,其實lambda表示式在c 中應用挺廣泛的。匿名函式,短小精悍,應該就是它的feature。好記性不如爛筆頭,書上有路勤為徑。可呼叫物件 對於任何乙個物件或...

C 11新特性 lambda表示式

在c 11以後,形如這樣的語法。capture parameters mutable return type 稱為乙個lambda表示式,表達乙個匿名函式。從程式設計的角度上看,lambda是一種函式式程式設計。分析語法 1.capture,可以通過值傳遞或者引用傳遞的方式給匿名函式提供訪問父作用域...