C++ lambda表达式详解
[ capture ] ( params ) opt -> ret {
body; };
capture 是捕获列表,params 是参数表,opt 是函数选项,ret 是返回值类型,body是函数体
一个完整的 lambda 表达式看起来像这样:
auto f = [](int a) -> int {
return a + 1; };
std::cout << f(1) << std::endl; // 输出: 2
lambda 表达式还可以通过捕获列表捕获一定范围内的变量:
- [] 不捕获任何变量
- [&] 捕获外部作用域中所有变量,并作为引用在函数体中使用(按引用捕获)
- [=] 捕获外部作用域中所有变量,并作为副本在函数体中使用(按值捕获)
- [=,&foo] 按值捕获外部作用域中所有变量,并按引用捕获 foo 变量
- [bar] 按值捕获 bar 变量,同时不捕获其他变量
- [this] 捕获当前类中的 this 指针,让 lambda 表达式拥有和当前类成员函数同样的访问权限。如果已经使用了 & 或者 =,就默认添加此选项。捕获 this 的目的是可以在 lamda 中使用当前类的成员函数和成员变量
class A
{
public:
int i_ = 0;
void func(int x, int y)
{
auto x1 = []{
return i_; }; // error,没有捕获外部变量
auto x2 = [=]{
return i_ + x + y; }; // OK,捕获所有外部变量
auto x3 = [&