c 11新特性 lambda函式

2021-10-04 03:55:29 字數 3307 閱讀 9040

lambda歷史悠久,在數理邏輯和電腦科學領域,lambda被用來表示一種匿名函式這種匿名函式代表了一種λ演算(lambda calculus),但是在c++領域直到c++11才引入lambda表示式,本文先打算從lambda函式入手、後續會繼續從lambda與仿函式、lambda基礎應用、lambda的實驗以及lambda與stl關係等5個方面來闡述一下c++11新特性lambda表示式

一、lambda函式

先看乙個例子來直觀地感受一下lambda函式

#include

using

namespace std;

intmain()

; cout<<

surplus

(salary,expense)

<

return0;

}

功能:lambda函式接收兩個引數(int,int),並返回兩者之差。

結構:與普通函式相比沒有函式名,取而代之的是一對方括號,此外返回值是採用返回型別追蹤的方式宣告。

lambda函式的語法定義如下:對於捕捉列表的使用是lambda表示式與普通函式最大的區別之一,就是lambda函式可以通過捕捉列表訪問一些上下文的資料。具體地,捕捉列表描述了上下文中哪些的資料可以被lambda使用,以及使用方法(值傳遞、引用傳遞),上個例子中我們使用了引數的方法傳遞變數,現在我們使用捕捉變數來改寫這個例子。

#include

using

namespace std;

intmain()

;//salary和expense被lambda函式捕獲,引數列表就可以省略

cout<<

surplus()

<

return0;

}

此時salary和expense可以視為函式的一種初始狀態,lambda函式則是基於初始狀態進行的運算,這與函式簡單基於引數的運算是不同的。

當然了,捕獲和引數列表可以同時存在,即捕獲又傳參

#include

using

namespace std;

intmain()

; cout<<

surplus

(tmp )

<

return0;

}

**語法上,捕捉列表由多個捕捉項組成,並以逗號分隔。捕捉列表主要有如下幾種形式:

但是要注意想要在mutbale在引用傳遞和值傳遞上的區別

#include

using

namespace std;

intmain()

; cout<<

"salary:"

<

cout<<

"surplus:"

<<

surplus

(salary,expense)

<

return0;

}

執行結果如下:

salary:8000

surplus:5000

這個例子有一定迷惑性,也是博主隨手寫成這樣了,才發現的問題,因為是值傳遞,其實[=]值傳遞過去的父空間的salary和expense沒有在lambda表示式內用到,而採用就近原則用的是引數列表(int salary,int expense)在下面呼叫的時候的引數傳遞的值。

言歸正傳,看一下mutable

#include

using

namespace std;

intmain()

; cout<<

"salary:"

<

cout<<

"surplus:"

<<

surplus()

<

return0;

}

編譯報錯如下:

因為lambda函式預設是const函式,所以要修改需要加上mutable(可修改的),如下:

#include

using

namespace std;

intmain()

; cout <<

"salary:"

<< salary << endl;

cout <<

"surplus:"

<<

surplus()

<< endl;

return0;

}

執行結果:

再來看一下引用傳遞有啥區別

#include

using

namespace std;

intmain()

; cout <<

"salary:"

<< salary << endl;

cout <<

"surplus:"

<<

surplus()

<< endl;

return0;

}

執行結果:

結果看出引用傳遞是否加mutable都是可以修改的,但是有個需要注意的地方,按照一般函式的理解,引用是要被修改了的,但是這邊的salary還是一開始的8000,而不是10000,所以說明不論是值傳遞還是引用傳遞,傳遞進去的值對父空間原值無影響。&與mutable的測試就不在贅述了

注意點:

[=,&] 這種寫法『=』已經以值傳遞的方法捕捉過所有的父作用域的變數,&再去捕捉的時候就會報錯

人,總是要有一點精神的,不是嗎

C 11新特性 Lambda函式(匿名函式)

c 11終於知道要在語言中加入匿名函式了。匿名函式在很多時候可以為編碼提供便利,這在下文會提到。很多語言中的匿名函式,如c 都是用lambda表示式實現的。lambda表示式又稱為lambda函式。我在下文中稱之為lambda函式。為了明白lambda函式的用處,請務必先搞明白c 中的自動型別推斷 ...

C 11新特性 Lambda函式(匿名函式)

宣告 本文參考了alex allain的文章 加入了自己的理解,不是簡單的翻譯 c 11終於知道要在語言中加入匿名函式了。匿名函式在很多時候可以為編碼提供便利,這在下文會提到。很多語言中的匿名函式,如c 都是用lambda表示式實現的。lambda表示式又稱為lambda函式。我在下文中稱之為lam...

C 11新特性 Lambda函式(匿名函式)

宣告 本文參考了alex allain的文章 加入了自己的理解,不是簡單的翻譯 c 11終於知道要在語言中加入匿名函式了。匿名函式在很多時候可以為編碼提供便利,這在下文會提到。很多語言中的匿名函式,如c 都是用lambda表示式實現的。lambda表示式又稱為lambda函式。我在下文中稱之為lam...