函數對象(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