c++中的lambda表达式

时间:2022-02-17 19:08:12

完整格式

[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 介绍

  1. [var]表示值传递方式捕获变量var;
  2. [=]表示将外部作用域的所有变量以值传递方式捕获,lambda表达式可以在函数内部定义,类内部定义,全局空间定义等几乎所有地方,这里所说的外部作用域的所有变量指lambda表达式所在作用域所能访问到的所有成员,例如:如果lambda在函数内部定义,[=]以值传递方式将函数内部所有成员以及全局空间中的变量捕获,如果lambda表达式在类内部定义[=]以值传递方式将类内部所有成员(包括this指针,成员函数等),全局空间中的变量等捕获;
  3. [&var]表示引用捕获var变量;
  4. [&]表示引用传递方式捕获所有外部作用域变量,使用引用捕获是危险的,因为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的用法详见:

http://blog.****.net/xiaoyink/article/details/79348806