lambda

在Lambda表达式的函数体内,是不能够访问到外部的变量的,如果想要使用函数体外定义的变量,就需要将它们进行"捕获"

[ ]:空捕获列表,即lambda表达式不能够使用所在函数中的变量

[=]:值捕获,即lambda表达式可以以拷贝的方式访问到函数中变量的值

[&]:引用捕获,即lambda表达式中所使用的其所在函数中的变量均是引用方式

当我们不希望在捕获的时候将所有的变量都捕获的时候,我们可以使用如下的方式进行捕获,例如:

[=sprite1,&sprite2]

这里我们仅仅捕获了两个变量,第一个变量是以值拷贝的方式捕获,第二个是以引用方式捕获,变量与变量之间用逗号分隔。

正常情况下,如果一个变量是值拷贝,Lambda不能改变它的值,如果我们希望改变一个值拷贝的变量的值,就需要在参数列表前加上关键字mutable

例如:

        auto s1=10;

        auto s2=[=s1](){return ++s1};//错误,因为s1是值拷贝,不能改变s1的值

        auto s2=[=s1]() mutable {return ++s1};//正确

1、空。没有使用任何函数对象参数。

2、=。函数体内可以使用Lambda所在作用范围内所有可见的局部变量(包括Lambda所在类的this),并且是值传递方式(相当于编译器自动为我们按值传递了所有局部变量)。

3、&。函数体内可以使用Lambda所在作用范围内所有可见的局部变量(包括Lambda所在类的this),并且是引用传递方式(相当于编译器自动为我们按引用传递了所有局部变量)。

4、this。函数体内可以使用Lambda所在类中的成员变量。

5、a。将a按值进行传递。按值进行传递时,函数体内不能修改传递进来的a的拷贝,因为默认情况下函数是const的。要修改传递进来的a的拷贝,可以添加mutable修饰符。

6、&a。将a按引用进行传递。

7、a, &b。将a按值进行传递,b按引用进行传递。

8、=,&a, &b。除a和b按引用进行传递外,其他参数都按值进行传递。

9、&, a, b。除a和b按值进行传递外,其他参数都按引用进行传递。

例子:

[]        //未定义变量.试图在Lambda内使用任何外部变量都是错误的.

[x, &y]  //x 按值捕获, y 按引用捕获.

[&]      //用到的任何外部变量都隐式按引用捕获

[=]      //用到的任何外部变量都隐式按值捕获

[&, x]    //x显式地按值捕获. 其它变量按引用捕获

[=, &z]  //z按引用捕获. 其它变量按值捕获

[&](int & x)->{ total += x; x *= 2; }

[&total](int & x) { total += x; x *= 2; }

[&](int & x) { total += x; x *= 2; }

[=](int x) { cout << x << " "; }

auto compare_lambda = [](int a, int b){ return a > b;};//有名lambda表达式

for_each(a, a + 4, [=](int x) { cout << x << " "; });

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。