完整格式
[capture list] (params list) mutable exception->return type{ function body}
各项具体含义如下:
1.capture list:捕获外部变量列表(不可省略)
2.params list:形参列表(没有可省略)
3.mutable指示符:使用值捕获到的外部变量默认为const类型,mutable可以用来解除const属性,(可选)
4.exception:异常设定,(可选)
5.return type:返回类型,(可选),对于有多个return语句的lambda表达式,必须显示指定返回类型
6.function body:函数体
capture list 介绍
- [var]表示值传递方式捕获变量var;
- [=]表示将外部作用域的所有变量以值传递方式捕获,lambda表达式可以在函数内部定义,类内部定义,全局空间定义等几乎所有地方,这里所说的外部作用域的所有变量指lambda表达式所在作用域所能访问到的所有成员,例如:如果lambda在函数内部定义,[=]以值传递方式将函数内部所有成员以及全局空间中的变量捕获,如果lambda表达式在类内部定义[=]以值传递方式将类内部所有成员(包括this指针,成员函数等),全局空间中的变量等捕获;
- [&var]表示引用捕获var变量;
- [&]表示引用传递方式捕获所有外部作用域变量,使用引用捕获是危险的,因为lambda表达式往往在定义后不立即调用,当调用时外部作用域变量可能已经销毁,引用指向未知区域,例如lambda在函数中定义,当调用lambda时函数可能已经结束,函数中局部变量也已经释放,lambda表达式在类中定义,当调用lambda表达式时,类对象可能已经释放,上述两种情况都是很危险的,所以使用引用捕获时要格外小心;
实例如下:
#include <iostream>#include <functional>
class lambda_test
{
public:
//lambda表达式可以用std::function封装器进行接收
std::function<void(int)> lambda = [&](int var){this->var = var; print();};
//构造函数
lambda_test(int var = 10) : var(var)
{}
void print()
{
std::cout << "var is " << var << std::endl;
}
//将类中的lambda表达式返回到类外部
std::function<void(int)> lambda_return()
{
return lambda;
}
private:
int var;
};
std::function<void(int)> test()
{
lambda_test lam;
lam.lambda(12);
auto lambda = lam.lambda_return();
lambda(13);
return lambda;
}
int main()
{
//test()函数中定义的对象lam已经释放
auto lambda = test();
//此时调用返回的lambda表达式正在操作已经释放的内存空间,是应该禁止的
lambda(14);
return 0;
}
关于std::function的用法详见: