红魔咖啡馆

头发越掉越多,头发越掉越少

0%

【C++】Lambda表达式

Lambda表达式

用于快速定义一个匿名函数对象(闭包)

语法:

1
2
3
[捕获变量](参数列表) 可选限定符->返回类型{
    代码
}

原理

实际上是函数对象的一种快速定义方式

1
2
3
4
5
6
7
8
9
int x = 7;
float y = 3.0;
struct {
    int _x;
    float y;
    float operator()(int a,int b) const{
        return _x *_ y+a*b;
    }
}p{x,y};

变量捕获

按值捕获

lambda中的成员变量是外部变量的拷贝

外部更改不会改变内部的变量

此时lambda对应的函数调用运算符默认是const函数,函数内部不能修改按值捕获的变量,也不能调用非常量函数(或者可以在lambda函数后加上mutable限制符)

按引用捕获

在中括号中变量前添加引用运算符

外部更改会改变内部的变量

若所引用的变量已经失效,则会报错或访问无效数据

默认捕获方式

  • [=]:默认按值捕获

  • [&]:默认按引用捕获

  • [this]/[*this]:在类中按引用/按值捕获,可以访问类成员

此时也可以添加特例,添加显式捕获的变量

但默认捕获和显式捕获不能相同

其中[=], [&], [&, this], [=, *this], [=, this]这几种捕获方式,this都是按引用捕获的

变量使用

除了可以使用捕获变量,还可以使用自定义变量,外层中的静态变量与全局变量

泛型lambda

在参数类型中使用auto即可实现泛型lambda,相当于套了类模板