目录:
1. lambda 函数概述
2、常见的坑:
3、实例:
正文:
1. lambda 函数概述
lambda 表达式是一种匿名函数,即没有函数名的函数;该匿名函数是由数学中的λ演算而来的。通常情况下,lambda函数的语法定义为:
(1) lambda 函数中“捕捉列表”详解
C++11中的lambda函数,其中的“捕捉列表”是由0个或多个“捕捉项”组成,并以逗号“,”分隔。捕捉列表有如下几种形式:
1)[var] 表示值传递方式捕捉变量var
2)[=] 表示值传递方式捕捉所有父作用域的变量(包括this)
3)[&var] 表示引用传递捕捉变量var
4)[&] 表示引用传递捕捉所有父作用域的比哪里(包括this)
5)[this] 表示值传递方式捕捉当前的this指针,目的是可以在lamda中使用当前类函数和成员变量。
闭包的优缺点很清晰,都是同一个:可以不通过传参获取调用者的上下文环境;
2、常见的坑:
不建议两种默认的捕获模式:
A、按值捕获——>捕获时机
B、按引用捕获——>悬空引用
3、实例:
int var1 = 100; std::string var2 = "hello"; auto myLambda = [var1, &var2](int param)->std::string { var2.append(std::to_string(var1)); var2.append(std::to_string(param)); return var2; };
|
上面的代码涉及三个概念:
1)lambda表达式(lambda expression)
2)闭包(closure)
3)闭包类(closure class)
例如,在上面这段代码中:
定义了一个变量:myLambda,它就是“闭包”
myLambda 的类型是一个编译器生成的匿名的类,也就是“闭包类”;
这个闭包类是由等号右边的”lambda表达式”生成的,这个lambda表达式:
按值捕获了var1;按引用捕获了var2;
并且接受一个int型参数;
返回一个std::string对象。