路上抓十個 C++ 專家問:「C++11 最棒的新功能是什麼?」十有八九會回答:Lambda!
如此有志一同,原因無他。沒有 Lambda 的年代,使用 STL 裡的 Algorithm 是很痛苦的一件事。Lambda 或許只是一種 Syntatic Sugar(語法糖),而且 Lambda 能做的事,幾乎都能「手寫」出來。但 Lambda 讓撰寫 C++ 程式碼變得更愉悅,也讓越來的 C++ 語言發展有更多可能。
Lambda(全稱為 Lambda Expression)是一種用來產生「不具名(Anonymous)函數物件(Function Object)」的表示式。長像如下:
初學者可能會被 Lambda 語法嚇到,最常被拿出來笑的是這個完全合法的 Lambda:[](){}
三種括號排一起,也算是合法的 C++ 程式碼?仔細查看上圖的語法定義,確實如此。雖然上圖中的 ->return
不見了,但 C++ 編譯器很聰明,某些情況下會推導遺漏的碼,並自行補充。所以不寫出來也關係。
當然,實務上不太可能這麼寫,那麼就來看看 Lambda 的細部組成。開頭的 []
稱為 Capture Clause,來表示 Lambda 的定義開始了。接著的 ()
等於函數的參數列;其後的 ->return
表示此 Lambda 的回傳值;最後的 {}
即 Lambda 的實作。