1. 程式人生 > 其它 >C++中Lambda函式(匿名函式)

C++中Lambda函式(匿名函式)

  • 匿名函式就是沒有名字的函式。有一些函式只是臨時用一下,而且業務邏輯也比較的簡單,相當於是臨時工,就沒必要給它定義成一個正常函式(包含有函式名,很正式的那種)。使用臨時的匿名函式,可以減輕函式的數量,讓程式碼變的清晰易讀。
    C++11提供了對匿名函式的支援,稱為Lambda函式(也叫Lambda表示式). Lambda表示式具體形式如下:
    [capture](parameters)->return-type{body}

[ ]是指閉包,閉包是指在Lambda函式之外宣告的變數,Lambda函式可以引用這些變數,這些變數的集合叫做閉包。在[ ]裡面可以定義變數是按值或這引用來捕獲。捕獲的含義就是:按照什麼型別來獲取的變數。即使沒有引用外部變數,也不能省略。

( )是指Lambda函式中用到的引數,這些引數是Lambda函式自己定義的區域性變數。沒有自定義的引數,可以省略。

return-type:是值Lambda函式執行完後,返回值的型別。如果沒有返回值,可省略不寫。

{body}:Lambda函式操作主體。

[](int x, int y) { return x + y; } // 隱式返回型別
[](int& x) { ++x; }   // 沒有return語句 -> lambda 函式的返回型別是'void'
[]() { ++global_x; }  // 沒有引數,僅訪問某個全域性變數
[]{ ++global_x; }     // 與上一個相同,省略了()

[](int x, int y) -> int { int z = x + y; return z; }

 Lambda函式可以引用在它之外宣告的變數. 這些變數的集合叫做一個閉包. 閉包被定義在Lambda表示式宣告中的方括號[]內. 這個機制允許這些變數被按值或按引用捕獲.下面這些例子就是:

[]        //未定義變數.試圖在Lambda內使用任何外部變數都是錯誤的.
[x, &y]   //x 按值捕獲, y 按引用捕獲.
[&]       //用到的任何外部變數都隱式按引用捕獲
[=]       //用到的任何外部變數都隱式按值捕獲
[&, x]    //x顯式地按值捕獲. 其它變數按引用捕獲
[=, &z]   //z按引用捕獲. 其它變數按值捕獲