亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

淺談C++11新引入的lambda表達式

2020-01-26 13:59:29
字體:
來源:轉載
供稿:網友

ISO C++ 11 標準的一大亮點是引入Lambda表達式?;菊Z法如下:

[capture list] (parameter list) ->return type { function body }

簡單的講一下各個部分的作用

1.[capture list]捕獲列表,捕獲到函數體中,使得函數體可以訪問
2.(parameter list)參數列表,用來表示lambda表達式的參數列表
3.->return type函數返回值 {function body}就是函數體

lambda表達式可以理解為一個匿名函數(但本質并不是),如果要使用lambda表達式聲明的函數,需要給他“命名”

lambda表達式可以表示閉包,因為本身就是這個類
閉包是指可以包含自由變量的代碼塊 (未綁定到特定的對象:舉個栗子std::function就可以產生一個對象,或者一個未指向任何函數的函數指針)

閉包講的通俗一些有以下幾點

1.自帶上下文的函數,閉包可以儲存運行時需要的上下文,這樣就可以在上下文不存在的時候還可以使用閉包(變量a生命周期到了被銷毀,但是在閉包中還可以拿來用)
2.可以把閉包看成一個重載了operator()的類,帶有狀態的意思就可以解釋成通過this指針使用成員變量
3.capture list就是lambda表達式實現閉包的方式

簡單使用的例子

--------------------------------------------------------------------------------

C++11為auto提供了新的功能,如他的名字一般,現在可以看成自動適應類型,可以適應多數類型
使用auto來代替變量的類型,前提是被明確類型的初始化變量初始化的,可以使用auto關鍵字

 auto f = [](){};  auto f = [](int a, int b)->int {return a + b; }; f(1, 2);//需要這么使用

只要是函數類型就都可以使用這個lambda表達式

 typedef int(*FUNC)(int a, int b); int main() {   FUNC a= [](int a, int b) {return a + b; };     printf("%d/n", a(1, 2)); }

聲明函數的方法都可以接收不帶捕獲列表的lambda表達式

 typedef std::function<int(int a, int b)> FUNC; int main() {   FUNC a= [](int a, int b) {return a + b; };     printf("%d/n", a(1, 2)); }

--------------------------------------------------------------------------------

lambda表達式中capture list的用法

 int func(int a, int b, std::function<int(int, int)> f) {   return f(a, b); }   int a=1; int b=2; int c=3; int d = func(a, b, [a, &b](int m, int n) {      printf("a = %d/n", a); // a是通過值傳遞捕獲,mutable只在函數體內修改有效     printf("b = %d/n", b); // b是引用傳遞捕獲,mutable可以對外部b造成影響                 //printf("c = %d/n", c); // c不可訪問      return m + n;   }); typedef int(*FUNC)(int m, int n,std::function<int(int ,int )> f);  void test() {   FUNC oho;   int a = 10;   int b = 20;   auto func = [&a, &b](int m, int n) {printf("a:%d b:%d/n", a, b); return m + n; };    }

1.[]空。沒有使用任何函數對象參數。
2.[=]。函數體內可以使用Lambda所在作用范圍內所有可見的局部變量(包括Lambda所在類的this),并且是值傳遞方式(相當于編譯器自動為我們按值傳遞了所有局部變量)。
3.[&]。函數體內可以使用Lambda所在作用范圍內所有可見的局部變量(包括Lambda所在類的this),并且是引用傳遞方式(相當于編譯器自動為我們按引用傳遞了所有局部變量)。
4.[this]。函數體內可以使用Lambda所在類中的成員變量。
5.[a]。將a按值進行傳遞。按值進行傳遞時,函數體內不能修改傳遞進來的a的拷貝,因為默認情況下函數是const的。要修改傳遞進來的a的拷貝,可以添加mutable修飾符。
6.[&a]。將a按引用進行傳遞。
7.[a, &b]。將a按值進行傳遞,b按引用進行傳遞。
8.[=,&a, &b]。除a和b按引用進行傳遞外,其他參數都按值進行傳遞。注意=符號的位置必須在頭一個
9.[&, a, b]。除a和b按值進行傳遞外,其他參數都按引用進行傳遞。&符號的位置必須在頭一個

當你想改變通過傳值方式捕捉的變量的時候就要添加mutable

[a, &b, &b2](int m, int n)mutable {a *= 2; return m*n; }:

--------------------------------------------------------------------------------

lambda表達式的其他用法

 class A { public:   A();   ~A();   void test()   {     auto f = [this](int m, int n) {printf("%d/n", a); };   }      private:   int a; };

lambda表達式本質是一種閉包類型,雖然他可以賦值給函數指針,但是只限于在捕獲列表為空的時候,當捕獲列表有值的時候,應該使用auto來接收lambda表達式,或者用std::function也是可以的

 main::__l2::<lambda_eb7b0a89c14bee3d2620c108ffb635c6>
 //這是一個lambda表達式在VS2015環境下顯示的類型,不用auto用什么來接收調用他呢?

本質來說lambda表達式之間是不允許賦值的

 auto a = [](int m, int n) {return m + n; }; auto b = [](int m, int n) {return m - n; }; a = b;

操作非法,因為閉包類型不允許使用賦值操作符,但是函數指針可以,也就是可以有下面的操作

 typedef int(*FUNC)(int a, int b); int main() {   FUNC a = [](int a, int b) {return a + b; };   FUNC b = [](int a, int b) {return a + b; };   a = b;   return 0; }

std::function之間也是可以賦值的,他就可以辦到有capture list的lambda表達式進行賦值

 typedef std::function<int(int,int)> FUNC; int m = 10; int n = 20; FUNC a = [m, n](int a, int b){printf("%d/n", m); return a + b; }; FUNC b = [m, n](int a, int b){return a + b; }; b = a; b(1, 2); //執行結果是可以把m打印出來的

以上就是本文給大家介紹的c++11的新特性lambda表達式的全部內容了,希望大家能夠喜歡

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久久久久久成人| 久久久精品2019中文字幕神马| 国产欧美日韩综合精品| 亚洲精品国产精品国自产在线| 亚洲一区二区三区视频播放| 国产精品久久久久久久av电影| 精品久久香蕉国产线看观看gif| 国产亚洲精品一区二区| 最近日韩中文字幕中文| 欧美香蕉大胸在线视频观看| 国产欧美精品va在线观看| 午夜精品久久久久久久99黑人| 国产精品毛片a∨一区二区三区|国| 国产欧洲精品视频| 欧美日韩xxx| 欧美伊久线香蕉线新在线| 欧美猛男性生活免费| 久久九九有精品国产23| 成人在线观看视频网站| 国产精品美女免费视频| 国产精品久久久久久久av大片| 久久国产精品久久精品| 国产剧情日韩欧美| 国产精品电影久久久久电影网| 日产精品久久久一区二区福利| 久久电影一区二区| 欧美韩国理论所午夜片917电影| 77777少妇光屁股久久一区| 久久久亚洲精选| 国产美女精品免费电影| 57pao国产精品一区| 精品呦交小u女在线| 亚洲精品久久久一区二区三区| 久久精品99无色码中文字幕| 一夜七次郎国产精品亚洲| 日本免费一区二区三区视频观看| 91高清视频免费观看| 久久久噜噜噜久噜久久| 久久久久久91香蕉国产| 不用播放器成人网| zzjj国产精品一区二区| 国产一区二区日韩精品欧美精品| 亚洲男人的天堂网站| 欧美激情国产高清| 尤物yw午夜国产精品视频| 久久最新资源网| 国产91在线视频| 96sao精品视频在线观看| xx视频.9999.com| 日韩亚洲欧美成人| 国产欧美一区二区三区久久| 精品国产31久久久久久| 成人福利网站在线观看| 久久99久久亚洲国产| 成人春色激情网| 国产精自产拍久久久久久蜜| 综合国产在线视频| 疯狂做受xxxx高潮欧美日本| 亚洲天堂影视av| 热门国产精品亚洲第一区在线| 亚洲欧美一区二区三区久久| 欧美专区中文字幕| 国产精品一区久久| 国产精品www色诱视频| 国产免费一区二区三区香蕉精| 欧美精品做受xxx性少妇| 91av在线视频观看| 亚洲天堂网在线观看| 欧美在线亚洲在线| 永久555www成人免费| 日韩在线观看免费高清完整版| 国产精品爽爽爽爽爽爽在线观看| 日韩成人网免费视频| 国产精品成久久久久三级| 少妇激情综合网| 欧美精品亚州精品| 在线精品国产成人综合| 日韩av在线免费播放| 亚洲福利视频二区| 亚洲激情视频在线播放| 成人欧美一区二区三区黑人孕妇| 久久久久久久久91| 国产视频在线观看一区二区| 国产视频亚洲精品| 福利视频一区二区| 精品福利在线观看| 大桥未久av一区二区三区| 国产激情视频一区| 欧美黑人一级爽快片淫片高清| 欧美成人精品在线视频| 国产美女久久精品| 性欧美xxxx视频在线观看| 成人欧美一区二区三区在线湿哒哒| 日本不卡视频在线播放| 日本成人精品在线| 亚洲福利影片在线| 日本免费一区二区三区视频观看| 久久国产精品亚洲| 懂色av一区二区三区| 久久亚洲一区二区三区四区五区高| 91沈先生作品| 在线视频日韩精品| 日韩欧美极品在线观看| 国产一区二区三区视频在线观看| 91精品国产高清自在线| 日韩精品久久久久久福利| 久久97精品久久久久久久不卡| 日韩一区二区三区xxxx| 欧美日韩成人网| 国产精品一区=区| 国产99在线|中文| 久久久久久久久久婷婷| 欧美精品videossex性护士| 欧美在线一区二区视频| 亚洲free性xxxx护士白浆| 欧美肥老妇视频| 久久不射电影网| 国产视频观看一区| 九九热最新视频//这里只有精品| 日韩视频免费大全中文字幕| 国产精品99导航| 欧美日韩在线观看视频小说| 亚洲图片制服诱惑| 久久国产精品久久久久久| 亚洲第一页自拍| 在线播放精品一区二区三区| 精品久久久久久久久久久久| 在线电影欧美日韩一区二区私密| 成人激情视频免费在线| 亚洲欧美日韩高清| 黄色91在线观看| 国产精品一区二区久久| 久久综合伊人77777蜜臀| 欧美综合国产精品久久丁香| 久久久噜噜噜久噜久久| 91亚洲精品在线观看| 欧美日韩国产成人| 九九九久久久久久| 欧美午夜www高清视频| 精品国内产的精品视频在线观看| 国产香蕉一区二区三区在线视频| 国产精品久久久久久av下载红粉| 国产成人精品国内自产拍免费看| 日韩欧美在线字幕| 色婷婷av一区二区三区在线观看| 国内偷自视频区视频综合| 亚洲国产精品免费| 国产精品视频免费观看www| 国产亚洲精品美女久久久| 97在线精品视频| 久久伊人精品天天| 欧美老肥婆性猛交视频| 91精品久久久久| 欧美午夜视频在线观看| 亚洲电影免费观看| 亚洲香蕉成视频在线观看| 色悠悠国产精品| 日韩**中文字幕毛片| 97视频在线看| 欧美在线免费视频| 精品久久久久久亚洲精品| 亚洲成人激情视频| 色小说视频一区| 欧美激情一区二区三区久久久|