Lambd Expression

  「Lambda 表達式」(lambda expression)是一個匿名函數,Lambda表達式基於數學中的λ演算得名,直接對應於其中的lambda抽象(lambda abstraction),是一個匿名函數,即沒有函數名的函數。Lambda表達式能夠表示閉包(注意和數學傳統意義上的不一樣)。express

C++表達式

  ISO C++ 11 標準的一大亮點是引入Lambda表達式。基本語法以下:
1
[capture list] (parameter list) ->  return  type { function body }
  其中除了「[ ]」(其中捕獲列表能夠爲空)和「複合語句」(至關於具名函數定義的函數體),其它都是可選的。它的類型是單一的具備成員operator()的非聯合的類類型,稱爲閉包類型(closure type)。
C++中,一個lambda表達式表示一個可調用的代碼單元。咱們能夠將其理解爲一個未命名的內聯函數。它與普通函數不一樣的是,lambda必須使用尾置返回來指定返回類型。
例如調用<algorithm>中的std::sort,ISO C++ 98 的寫法是要先寫一個compare函數:
1
2
3
4
bool  compare( int & a, int & b)
{
     return  a>b;
}
  而後,再這樣調用:
1
sort(a, a+n, compare);
  然而,用ISO C++ 11 標準新增的Lambda表達式,能夠這麼寫:
1
sort(a, a+n, []( int  a, int  b){ return  a>b;}); //降序排序
  這樣一來,代碼明顯簡潔多了。
  因爲Lambda的類型是單一的,不能經過類型名來顯式聲明對應的對象,但能夠利用auto關鍵字和類型推導:
1
auto  f=[]( int  a, int  b){ return  a>b;};
  和其它語言的一個較明顯的區別是Lambda和C++的類型系統結合使用,如:
1
2
3
4
auto  f=[x]( int  a, int  b){ return  a>x;}; //x被捕獲複製
int  x=0, y=1;
auto  g=[&]( int  x){ return  ++y;}; //y被捕獲引用,調用g後會修改y,須要注意y的生存期
bool (*fp)( int int )=[]( int  a, int  b){ return  a>b;}; //不捕獲時纔可轉換爲函數指針
  Lambda表達式能夠嵌套使用。
  即將出版的ISO C++14支持基於類型推斷的泛型lambda表達式。上面的排序代碼能夠這樣寫:
1
sort(a, a+n, []( const  auto & a, const  auto & b){ return  a>b;}); //降序排序:不依賴a和b的具體類型
  由於參數類型和函數模板參數同樣能夠被推導而無需和具體參數類型耦合,有利於重構代碼;和使用auto聲明變量的做用相似,它也容許避免書寫過於複雜的參數類型。特別地,不須要顯式指出參數類型使使用高階函數變得更加容易。
相關文章
相關標籤/搜索