c++11標準:匿名函數(匿名錶達式)lambda

lambda:算法

  C++11提供了對匿名函數的支持,稱爲Lambda函數(也叫Lambda表達式). Lambda表達式具體形式以下:閉包

    匿名函數定義/匿名錶達式聲明:[capture](parameters)->return-type{body}函數

    函數調用:function a = [capture](parameters)->return-type{body};this

         a(parameters);spa

 

  parameters:形參code

    和函數同樣對象

    若是沒有參數,空的圓括號()能夠省略.blog

    返回值也能夠省略,若是函數體只由一條return語句組成或返回類型爲void的話.形如:作用域

       [capture](parameters){body}編譯器

      返回值類型能夠經過如下算法推演出來

      •   若是 lambda 代碼塊中包含了 return 語句,則該 lambda 表達式的返回類型由 return 語句的返回類型肯定。
      •   若是沒有 return 語句,則相似 void f(...) 函數。

    例如:

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

  []:外部閉包

    Lambda函數能夠引用在它以外聲明的變量. 這些變量的集合叫作一個閉包.  閉包被定義在Lambda表達式聲明中的方括號[]內.

    閉包能夠按值、引用捕獲:

    例如:  

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

    對this的捕獲:只能夠是值捕獲,

      在類成員中的lamda函數:

      對protect和priviate成員來講, 這個lambda函數與建立它的成員函數有相同的訪問控制.

      訪問this的成員沒必要使用this->語法,能夠直接訪問.

    注意:若是一個閉包含有局部變量(類和局部)的引用,在超出建立它的做用域以外的地方被調用的話,這種行爲是未定義的!

 

 

lambda函數是一個依賴於實現的函數對象類型,這個類型的名字只有編譯器知道.

若是用戶想把lambda函數作爲一個參數來傳遞, 那麼形參的類型必須是模板類型或者必須能建立一個std::function相似的對象去捕獲lambda函數.

使用 auto關鍵字能夠幫助存儲lambda函數,  

相關文章
相關標籤/搜索