lambda表示式 是乙個函式,乙個匿名函式,也就是沒有函式名的函式,為什麼不需要函式名呢,因為我們直接(一次性的)用它,嵌入式用的它,不需要其他地方用它。
也叫閉包,閉就是封閉的意思,就是其他地方都不用他,包就是函式。
lambda表示式 其實就是乙個函式物件,他內部建立了乙個過載()操作符的類。
int main() (); //代表lambda表示式的開始,{}代表函式體,什麼都沒有,()代表呼叫函式.
}等價於:
void f() {}
int main()
像其他函式一樣,我們需要乙個引數列表:()。
所以: {}(); 也可以寫: () {}();
注:加了乙個()代表函式引數。什麼引數都沒有,就可以省略。
int main()
();}
也可以這樣:
int main()
;lam();}
-> int :代表返回int。
{}(); 加引數也可以這樣寫: () {}(); 加引數、返回值這樣寫 ()-> int {};
int main()
;auto ret = lam();
auto lam2 =() -> string ;
auto ret1 = lam2();}
變數捕獲才是成就lambda卓越的秘方。
不捕獲任何變數
[&] 以引用方式捕獲所有變數
[=] 用值的方式捕獲所有變數(可能被編譯器優化為const &)
[=, &foo] 以引用捕獲foo, 但其餘變數都靠值捕獲
[&, foo] 以值捕獲foo, 但其餘變數都靠引用捕獲
[bar] 以值方式捕獲bar; 不捕獲其它變數
[this] 捕獲所在類的this指標
int a=1,b=2,c=3;
auto lam2 = [&,a](); //b,c以引用捕獲,a以值捕獲。
lam2();
思考: lambda變數捕獲與lambda函式引數使用的區別及各自的優缺點
vectoraddress;
for_each(address.begin(),address.end(),(string& str)
}return results;
}void setaddress(const std::vector&address)
private:
std::vector_addresses;
};addressbook global_address_book;
//查詢匹配名字的位址
vectorfindaddressesfromname (const string &name));}
//查詢匹配長度的位址
vectorfindaddresseslen (const int &min_len)
);}int main()
;global_address_book.setaddress(address);
auto ret = findaddressesfromname("china");
for_each(ret.begin(),ret.end(),(string &i)
C 11 lambda表示式 詳解
如下圖,lambda表示式由下面幾個部分構成 c 11 的 lambda 表示式規範如下 mutable 修飾符說明 lambda 表示式體內的 可以修改 獲的變數,並且可以訪問 獲物件的 non const 方法。exception 說明 lambda 表示式是否丟擲異常 noexcept 以及丟...
C 11 lambda 表示式解析
中括號中 from 下面是各種變數擷取的選項 小括號中,就是函式引數 lambda表示式可以作為其它函式引數 1 標準格式 有箭頭 就要顯示寫明返回值型別 auto pfunc1 this void pfunc1 2 簡化格式 void 型別返回值 沒有箭頭 會預設檢測返回值型別 auto pfun...
C 11 Lambda表示式簡介
lambda簡介 capture列表 mutable說明 c 11中的lambda 表示式用於定義並建立匿名的函式物件,以簡化程式設計工作。lambda表示式一般都是從方括號開始,然後結束於花括號 主要包括五個部分 常見幾種lambda表示式形式 表示式 capture params mutable...