lambda表达式的基本形式,如下:
[capture list] (params list) [key word: mutuble] ->return type { func body }
说明:
(1) [capture list]里面的内容具体形式如下:
(2)
params list 输入参数,这个和普通的函数一样
(3)keyword:mutuble:默认情况下,lambda表达式不会改变一个通过传值方式来捕获参数的值,通过mutuble可以实现这个问题。
(4)return type:默认该部分是可选的,但是如果lambda表达式有2个或以上的return,那么必须指定返回类型
(5) func body:函数体
以下是一些例子
#include <iostream> #include <algorithm> #include <string> using namespace std; void testCaptureList() { int a = 1; int b = 2; // auto fun = []() { cout << a + b << endl;}; // error 无法隐式捕获“a” "b",因为尚未指定默认捕获模式 auto fun0 = [a,b]() { cout << a + b << endl;}; //0k fun0(); //3 auto fun1 = [=]() { cout << a + b << endl;}; // OK // auto fun2 = [=]() { a++; cout << a + b << endl;}; // error C3491: “a”: 无法在非可变 lambda 中修改通过复制捕获 fun1(); //3 cout << "a = " << a << " b = " << b << endl; auto fun3 = [&]() { a++; b++; cout << a + b << endl;}; fun3(); //5 cout << "a = " << a << " b=" << b << endl; // auto fun4 = [=, &a] () { a++; b++; cout << a + b << endl;}; // error C3491: “b”: 无法在非可变 lambda 中修改通过复制捕获 auto fun5 = [&b, &a]() { a++; b++; cout << a + b << endl;}; fun5(); //7 } void testReturnType() { auto fun1 = []() {return 1;}; cout << fun1() << endl; auto fun2 = [](int a) {return a + 1;}; cout << fun2(4) << endl; int bbb = 5; //在VS2017编译可以通过,在code:blocks 16.01编译出现问题(error C3499: 已指定返回类型为 void 的 lambda 无法返回值) auto fun3 = [](int a) { if (a < 0) return -a; else return a;}; cout << fun3(bbb) << endl; auto fun4 = [](int a) -> int { if (a < 0) return -a; else return a;}; cout << fun4(-4) << endl; } void testMutable() { int v1 = 33; auto f = [v1]() mutable {return ++v1;}; v1 = 0; cout << f() <<" ," <<v1<<endl; //34,0 auto f1 = [&v1]() {return ++v1;}; v1 = 0; cout << f1() << endl; //1 cout << v1 << endl; //1 auto f2 = [&v1]() {return ++v1;}; v1 = 0; cout << f1() << "," << v1 << endl; //1,0 右结合原因 } void testParam() { string a = "1111"; string b = "22222"; string c = "3333"; auto theSameLen = [](const string &a, const string &b) {return a.length() == b.length();}; cout << theSameLen(a, b) << endl; //0 cout << theSameLen(a, c) << endl; //1 auto addChZ = [](string &a) { a += "Z"; }; addChZ(a); cout<<a<< endl; //1111Z } void Print(const int &a) { cout << a << " "; } int main() { int aa[] = { 1,2,3,4 }; for_each(aa, aa + 4, Print); cout << endl; for_each(aa, aa + 4, [](const int &a) { cout << a << " "; }); auto fun = [](int a, int b) { return a + b;}; cout << endl << fun(2, 3) << endl; int a1 = 3; auto fun2 = [a1](int a) {return a1 + a; }; cout << endl << fun2(33) << endl; testCaptureList(); testReturnType(); testMutable(); testParam(); system("pause"); return 0; }关于lambda表达的效率问题,参考文章: c++11 lambda 的效率