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;}
等價於
()( &s ) { s.size()&
Reference:
http://zh.cppreference.com/w/cpp/language/lambda
http://www.cprogramming.com/c++11/c++11-lambda-closures.html