最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2017年07月29日 12:02:11   作者:lenomirei  
Lambda表達式(又稱Lambda函數(shù),英文原文是Lambda Expression),是C++11的新特性中非常實用的一個。

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

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

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

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

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

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

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

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

簡單使用的例子

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

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

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

只要是函數(shù)類型就都可以使用這個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));
 }

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

當你想改變通過傳值方式捕捉的變量的時候就要添加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表達式本質(zhì)是一種閉包類型,雖然他可以賦值給函數(shù)指針,但是只限于在捕獲列表為空的時候,當捕獲列表有值的時候,應(yīng)該使用auto來接收lambda表達式,或者用std::function也是可以的

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

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

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

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

 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);
 //執(zhí)行結(jié)果是可以把m打印出來的

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

相關(guān)文章

  • 詳解C++編程中的主表達式與后綴表達式編寫基礎(chǔ)

    詳解C++編程中的主表達式與后綴表達式編寫基礎(chǔ)

    這篇文章主要介紹了C++編程中的主表達式與后綴表達式編寫基礎(chǔ),是C++入門學習中的基礎(chǔ)知識,需要的朋友可以參考下
    2016-01-01
  • C語言中strspn()函數(shù)和strcspn()函數(shù)的對比使用

    C語言中strspn()函數(shù)和strcspn()函數(shù)的對比使用

    這篇文章主要介紹了C語言中strspn()函數(shù)和strcspn()函數(shù)的對比使用,strspn是計算屬于字符串的字符數(shù)而strcspn則是判斷不屬于,需要的朋友可以參考下
    2015-08-08
  • Qt實現(xiàn)TCP客戶端和服務(wù)器通訊程序

    Qt實現(xiàn)TCP客戶端和服務(wù)器通訊程序

    這篇文章主要為大家詳細介紹了Qt實現(xiàn)TCP客戶端和服務(wù)器通訊程序,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • c語言中assert斷言用法實例詳解

    c語言中assert斷言用法實例詳解

    斷言是C語言中一種用于檢查程序中假設(shè)語句正確性的方法,通過使用斷言,開發(fā)人員可以在程序中插入一些條件,以確保程序的執(zhí)行滿足特定的預(yù)期,這篇文章主要給大家介紹了關(guān)于c語言中assert斷言用法的相關(guān)資料,需要的朋友可以參考下
    2024-02-02
  • C++控制臺強化如何實現(xiàn)一定界面效果(簡潔版)

    C++控制臺強化如何實現(xiàn)一定界面效果(簡潔版)

    這篇文章主要介紹了C++控制臺強化如何實現(xiàn)一定界面效果(簡潔版),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • C++中引用的使用總結(jié)

    C++中引用的使用總結(jié)

    以下是對C++中引用的使用進行了詳細的總結(jié)介紹,需要的朋友可以過來參考下,希望對大家有所幫助
    2013-10-10
  • 簡易Dota改鍵程序制作

    簡易Dota改鍵程序制作

    利用全局鉤子制作一個個性化的dota游戲改鍵功能,大家可以參考使用
    2013-11-11
  • 詳解如何在C/C++中測量一個函數(shù)或功能的運行時間

    詳解如何在C/C++中測量一個函數(shù)或功能的運行時間

    本文算是一個比較完整的關(guān)于在 C/C++ 中測量一個函數(shù)或者功能的總結(jié),最后會演示三種方法的對比,文章通過代碼示例給大家介紹的非常詳細,需要的朋友可以參考下
    2023-12-12
  • C++實現(xiàn)評教管理系統(tǒng)

    C++實現(xiàn)評教管理系統(tǒng)

    這篇文章主要為大家詳細介紹了C++實現(xiàn)評教管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • C語言枚舉的使用以及作用

    C語言枚舉的使用以及作用

    這篇文章主要介紹了C語言枚舉的使用以及使用,閱讀下面內(nèi)容我們將掌握枚舉的相關(guān)概念、掌握枚舉的幾種用法、掌握枚舉在實際產(chǎn)品中的用法,需要的朋友可以參考一下
    2022-03-03

最新評論

莱州市| 枣强县| 嵊州市| 宁乡县| 宝坻区| 思南县| 山东省| 藁城市| 思茅市| 宣城市| 鹤岗市| 泸西县| 淄博市| 普洱| 崇州市| 金华市| 城固县| 雅江县| 泰来县| 墨竹工卡县| 涟源市| 静海县| 怀宁县| 嘉黎县| 鲁山县| 太白县| 二连浩特市| 和硕县| 六安市| 淮滨县| 罗平县| 大埔区| 芜湖市| 高安市| 东兴市| 富宁县| 申扎县| 中阳县| 福安市| 苗栗市| 剑川县|