函數對象

函數對象(Lambdas)

C++11允許定義內部函數,可以當做參數或者對象使用。

格式和參數

[capture](parameters) mutable throwSpec ->retType {statement}

例如:
[](int a, int b) -> int { return a + b; }
[capture]:捕捉列表

捕捉列表總是出現的lambda表達式的開始處。事實上,[]是lambda引出符。編譯器根據該引出符判斷接下來的代碼是否是lambda函數。捕捉列表能夠捕捉上下文中的變量供lambda函數使用。

(parameters):參數列表

與普通函數的參數列表一致。如果不需要參數傳遞,則可以連同括號()一起省略。

mutable:mutable修飾符

默認情況下,lambda函數總是一個const函數,mutable可以取消其常量性。在使用該修飾符時,參數列表不可省略(即使參數爲空)。

->return_type:返回類型

用追蹤返回類型形式聲明函數的返回類型。出於方便,不需要返回值的時候也可以連同符號->一起省略。此外,在返回類型明確的情況下,也可以省略該部分,讓編譯器對返回類型進行推導。

{statement}:函數體

內容與普通函數一樣,不過除了可以使用參數之外,還可以使用所有捕獲的變量。在lambda函數的定義式中,參數列表和返回類型都是可選部分,而捕捉列表和函數體都可能爲空,C++中最簡單的lambda函數只需要聲明爲:[]{};

值傳遞引用傳遞不同

[]:沒有定義任何變量,使用未定義的變量會引發錯誤
[x, &y]:x以值傳遞方式傳入(默認),y以引用的方式傳入
[&]:任何被使用到的外部變量都被隱式地以引用方式加以引用
[=]:任何被使用到的外部變量都被隱式地以傳值方式加以引用
[&, x]:x顯式地以傳值方式加以引用,其餘變量以引用方式加以引用
[=, &z]:z顯式的以引用方式加以引用,其餘變量以傳值方式加以引用

使用this指針

對於[=]或[&]的形式,lambda表達式可以直接使用this指針,但是對於[]的形式,如果要使用this指着,必須顯式傳入:

[this]() { this->someFunc(); }();

用法

auto f = [](int a, int b) { return a + b; }; // ok 自動推斷出返回類型
int f = [](int a, int b) { return a + b; };  // error
int f = [](int a, int b) ->int { return a + b; }; // error

參考

https://www.jianshu.com/p/d4c0702d99d0

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章