1. 程式人生 > >C++11 lambda

C++11 lambda

lambda表示式最前面的方括號的意義何在?其實這是lambda表示式一個很要的功能,就是閉包。這裡我們先講一下lambda表示式的大致原理:每當你定義一個lambda表示式後,編譯器會自動生成一個匿名類(這個類當然過載了()運算子),我們稱為閉包型別(closure type)。那麼在執行時,這個lambda表示式就會返回一個匿名的閉包例項,其實一個右值。所以,我們上面的lambda表示式的結果就是一個個閉包。閉包的一個強大之處是其可以通過傳值或者引用的方式捕捉其封裝作用域內的變數,前面的方括號就是用來定義捕捉模式以及變數,我們又將其稱為lambda捕捉塊。看下面的例子:

int main(int
argc, char const *argv[]) { int x =10; auto add_x = [x](int a){return a+x;}; auto multipy_x = [&x](int a){return a*x;}; cout<<"add "<<add_x(10)<<" "<<"multipy "<< multipy_x(10)<<endl; getchar(); return 0; }

lambda捕捉塊為空時,表示沒有捕捉任何變數。但是上面的add_x

是以複製的形式捕捉變數x,而multiply是以引用的方式捕捉x。前面講過,lambda表示式是產生一個閉包類,那麼捕捉是回事?對於複製傳值捕捉方式,類中會相應新增對應型別的非靜態資料成員。在執行時,會用複製的值初始化這些成員變數,從而生成閉包。

 

捕獲的方式可以是引用也可以是複製,但是具體說來會有以下幾種情況來捕獲其所在作用域中的變數:

  • []:預設不捕獲任何變數;
  • [=]:預設以值捕獲所有變數;
  • [&]:預設以引用捕獲所有變數;
  • [x]:僅以值捕獲x,其它變數不捕獲;
  • [&x]:僅以引用捕獲x,其它變數不捕獲;
  • [=, &x]:預設以值捕獲所有變數,但是x是例外,通過引用捕獲;
  • [&, x]:預設以引用捕獲所有變數,但是x是例外,通過值捕獲;
  • [this]:通過引用捕獲當前物件(其實是複製指標);
  • [*this]:通過傳值方式捕獲當前物件;