- 匿名函數就是沒有名字的函數。有一些函數只是臨時用一下,而且業務邏輯也比較的簡單,相當於是臨時工,就沒必要給它定義成一個正常函數(包含有函數名,很正式的那種)。使用臨時的匿名函數,可以減輕函數的數量,讓代碼變的清晰易讀。
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按引用捕獲. 其它變量按值捕獲