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按引用捕獲. 其它變量按值捕獲


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM