C Lambda表示式用法

2021-08-13 08:20:32 字數 1600 閱讀 9199

c++ 11中的lambda表示式用於定義並建立匿名的函式物件,以簡化程式設計工作。

lambda的語法形式如下:

[函式物件引數] (操作符過載函式引數) mutable或exception宣告 -> 返回值型別 

可以看到,lambda主要分為五個部分:[函式物件引數]、(操作符過載函式引數)、mutable或exception宣告、-> 返回值型別、。

下面分別進行介紹。

一、[函式物件引數],標識乙個lambda的開始,這部分必須存在,不能省略。函式物件引數是傳遞給編譯器自動生成的函式物件類的建構函式的。函式物件引數只能使用那些到定義lambda為止時lambda所在作用範圍內可見的區域性變數(包括lambda所在類的this)。函式物件引數有以下形式:

1、空。沒有使用任何函式物件引數。

2、=。函式體內可以使用lambda所在作用範圍內所有可見的區域性變數(包括lambda所在類的this),並且是值傳遞方式(相當於編譯器自動為我們按值傳遞了所有區域性變數)。

3、&。函式體內可以使用lambda所在作用範圍內所有可見的區域性變數(包括lambda所在類的this),並且是引用傳遞方式(相當於編譯器自動為我們按引用傳遞了所有區域性變數)。 4、this。函式體內可以使用lambda所在類中的成員變數。 5、a。將a按值進行傳遞。按值進行傳遞時,函式體內不能修改傳遞進來的a的拷貝,因為預設情況下函式是const的。要修改傳遞進來的a的拷貝,可以新增mutable修飾符。 6、&a。將a按引用進行傳遞。 7、a, &b。將a按值進行傳遞,b按引用進行傳遞。 8、=,&a, &b。除a和b按引用進行傳遞外,其他引數都按值進行傳遞。 9、&, a, b。除a和b按值進行傳遞外,其他引數都按引用進行傳遞。

二、(操作符過載函式引數),標識過載的()操作符的引數,沒有引數時,這部分可以省略。引數可以通過按值(如:(a,b))和按引用(如:(&a, &b))兩種方式進行傳遞。

三、mutable或exception宣告,這部分可以省略。按值傳遞函式物件引數時,加上mutable修飾符後,可以修改按值傳遞進來的拷貝(注意是能修改拷貝,而不是值本身)。exception宣告用於指定函式丟擲的異常,如丟擲整數型別的異常,可以使用throw(int)。

四、-> 返回值型別,標識函式返回值的型別,當返回值為void,或者函式體中只有一處return的地方(此時編譯器可以自動推斷出返回值型別)時,這部分可以省略。

五、,標識函式的實現,這部分不能省略,但函式體可以為空。

下面給出了一段示例**,用於演示上述提到的各種情況,**中有簡單的注釋可作為參考。

#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: "; for (auto i: c)  std::cout << '\n'; std::function func = (int i) ; std::cout << "func: " << func(6) << '\n'; }

分類: 

c++

C Lambda表示式用法

c 11中的lambda表示式用於定義並建立匿名的函式物件,以簡化程式設計工作。lambda的語法形式如下 函式物件引數 操作符過載函式引數 mutable或exception宣告 返回值型別可以看到,lambda主要分為五個部分 函式物件引數 操作符過載函式引數 mutable或exception...

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。因...