基本语法
[capture list] (parameter list) ->return type { function body }
- [capture list]: 捕捉说明符,表示一个Lambda的开始。可为空。
- (parameter list):参数列表。可省略
- return type:返回类型(int,doule……)。可省略
- function body:函数体。
使用Lambda表达式不仅让代码变的简单、而且可读、最重要的是代码量也随之减少很多。
例子1
void test1()
{
cout << "hello world" << endl;
}
void main()
{
auto test2 = [](){cout << "hello world" << endl;};
test1();
test2();
system("pause");
}
在Lambda表达式中获得xy的值,但是不可以改变它们的值。
例子2
int x = 1, y = 2;
auto test = [x, y] {return x > y; };
cout << test() << endl;
在Lambda表达式中获得xy的值,并改变它们的值。
例子3
int x = 1, y = 2;
auto test = [&x, &y]
{
y++;
return x += y;
};
cout << test() << endl;
cout << y << endl;
以下是捕捉说明符的用法
- [] 不截取任何变量
- [foo] 截取foo变量并且拷贝一份在函数体重使用
- [&} 截取外部作用域中所有变量,并作为引用在函数体中使用
- [=] 截取外部作用域中所有变量,并拷贝一份在函数体中使用
- [=, &foo] 截取外部作用域中所有变量,并拷贝一份在函数体中使用,但是对foo变量使用引用
- [x, &y] x按值传递,y按引用传递
- [this] 以值的方式捕获 this 指针
Lambda表达式有一个很有意思的事情就是,按值传递【foo】的时候值在声明Lambda那一刻就已经确定了,无论怎样后面怎样修改都无法改变。
例子4
int a = 1, b = 2;
auto test = [&a,b]
{
cout << "a = " << a << endl;
cout << "b = " << b << endl;
};
a = 100, b = 99;
test();
结果是 a = 100 , b = 2。
对于 ->return type
例子5
int a = 1;
auto test = [a]()->double {return a; };
cout << "sizeof(int) = " << sizeof(int) << endl;
cout << "sizeof(test()) = " << sizeof(test()) << endl;
返回结果是
sizeof(int) = 4
sizeof(test()) = 8
一目了然了,对不对。
修饰说明符 mutable
例子6
int a = 1;
auto test = [a]() mutable { return ++a; };
cout <<test() << endl;
结果为 2。
mutalbe的中文意思是“可变的,易变的”,跟constant(既C++中的const)是反义词。
在C++语言中,是使用较少的关键字——如果一个函数被const 修饰,那么它将无法修改其成员变量的,但是如果这个成员变量是被mutable修饰的话,则可以修改。
以上。