程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> c++11之lambda表達式

c++11之lambda表達式

編輯:C++入門知識

Lambda是c++11中最重要的新特性之一,cppreference.com是這樣定義的:

an unnamed function object capable of capturing variables in scope。即可以使用臨時局部變量的匿名函數。

Lambda的完整語法如下:

[ capture ] ( params ) mutable(optional) exception attribute -> ret { body }

除了[ capture ]和{ body }是必需的,其他都可以省略。

Capture

Capture定義了lambda需要使用的同一作用域的局部變量,全局變量和外部變量不需要捕獲就可以直接使用。

[] 不捕獲任何局部變量

[&] 引用捕獲所有局部變量

[=] 值捕獲所有局部變量

[=, &foo] 除了foo引用捕獲,其他局部變量全部值捕獲

[bar] 只值捕獲bar

[this] 捕獲宿主對象指針。

最主要的區別是值捕獲和引用捕獲

 n == [=n]( &s) { s.size()>= [&n]( &s) { name =++
f2(name); 

Return type

如果沒有return語句,那麼編譯器會推斷return void,

[]( &s) {cout<< s.size()>;}

只有一個return語句,編譯器也可以根據返回值推斷出返回類型,下面兩種方法是等價的

[]( &s) { s.size()>[]( &s)  { s.size()>;}

如果函數體內有多個return語句,需要用尾置返回類型->明確指定,

[]( &s){ s.size()>)  ;   ;} 
[]( &s) –> { s.size()>)  ;   ;} 

Exception

下面lambda表示不拋出異常:

[]( &s) () ->  { s.size()>;}

Mutable

如果需要修改捕獲的值,則需要mutable

 n == [n]( &s)mutable {n++;  s.size()>n;}

lambda的實現

編譯器會將Lambda表達式轉換為函數對象,比如

[]( &s){ s.size()>;}

等價於

 ()( &s )  { s.size()>

如果capture list有值捕獲參數的話,將作為函數對象的私有數據保存,引用捕獲可以直接使用引用變量,不需要緩存。

[n]( &s){ s.size() > n;}

等價於

 ()( &amp;s )  { s.size()&

 

 

Reference:

http://zh.cppreference.com/w/cpp/language/lambda

http://www.cprogramming.com/c++11/c++11-lambda-closures.html

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved