從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指標,要麼通過[=]或[&]進行隱式捕獲。預設的lamba的宣告方式是const宣告,通過值獲取的引數在lambda內是無法修改的,如果要改變該值,在引數列表後面加上mutable關鍵字。使用引用捕獲時,特別注意這些引數實體的生存期,保證呼叫lambda時這些實體是有意義的,避免懸垂引用的產生。
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,可以通過值傳遞或者引用傳遞的方式給匿名函式提供訪問父作用域...