1. 程式人生 > 其它 >C++中Lambda表示式淺析

C++中Lambda表示式淺析

1. Lambda表示式

Lambda表示式是C++11最重要也是最常用的特性之一,是現代程式語言的一個特點,簡潔,提高了程式碼的效率並且可以使程式更加靈活

Lambda表示式就是一個匿名函式,所謂匿名函式,那自然是沒有名字的函式,當一個函式只是臨時使用而且比較簡單的時候,就可以採用Lambda表示式

Lambda表示式的語法格式如下:

當你不需要capture捕獲的時候,就直接寫一個框框[]
當你不需要引數的時候,就直接寫一個括號()
當年不需要返回值的時候,不用寫箭頭->和ret(返回值型別)

[capture](params) opt -> ret {body;};
	- capture: 捕獲列表
    - params: 引數列表
    - opt: 函式選項
    - ret: 返回值型別
    - body: 函式體
        
// 示例程式碼->匿名函式的呼叫:
int ret = [](int a) -> int
{
	return a+1;
}(100);

關於Lambda表示式的細節介紹:

  1. 捕獲列表: 捕獲一定範圍內的變數
    • [] - 不捕捉任何變數
    • [&] - 捕獲外部作用域中所有變數, 並作為引用在函式體內使用 (按引用捕獲)
    • [=] - 捕獲外部作用域中所有變數, 並作為副本在函式體內使用 (按值捕獲)
      • 拷貝的副本在匿名函式體內部是隻讀的
    • [=, &foo] - 按值捕獲外部作用域中所有變數, 並按照引用捕獲外部變數 foo
    • [bar] - 按值捕獲 bar 變數, 同時不捕獲其他變數
    • [&bar] - 按值捕獲 bar 變數, 同時不捕獲其他變數
    • [this] - 捕獲當前類中的this指標
      • 讓lambda表示式擁有和當前類成員函式同樣的訪問許可權
      • 如果已經使用了 & 或者 =, 預設新增此選項
  2. 引數列表: 和普通函式的引數列表一樣
  3. opt 選項 --> 可以省略
    • mutable: 可以修改按值傳遞進來的拷貝(注意是能修改拷貝,而不是值本身)
    • exception: 指定函式丟擲的異常,如丟擲整數型別的異常,可以使用throw();
  4. 返回值型別:
    • 標識函式返回值的型別,當返回值為void,或者函式體中只有一處return的地方(此時編譯器可以自動推斷出返回值型別)時,這部分可以省略
  5. 函式體:
    • 函式的實現,這部分不能省略,但函式體可以為空。

2. 實列

下面實現一個最簡單的lambda表示式,沒有返回值,沒有引數

[]()
    {
        cout << "這是lambda表示式" <<endl;
    };

以上只是定義,如果要使用的話,在函式的末尾加上引數列表,代表要傳的引數

比如這樣

[]()
    {
        cout << "這是lambda表示式" <<endl;
    }();

這樣這個lambda表示式就會執行,如果有引數的話,底下那個括號要填引數,有返回值的話要有箭頭和返回值型別,大概基礎的部分就是這麼多。