lambda表达式

语法形式:[ capture ] ( params ) opt -> ret { body; }
注意:

  1. 允许省略返回值类型,编译器会自动推导出返回类型。

  2. 在没有参数列表时,可以省略参数列表即小括号

  3. [] 表示不捕获任何变量;
    [&] 捕获外部作用域所有变量,且作为引用在函数体中使用(按引用捕获)
    [=]捕获外部作用域所有变量,且作为副本使用(按值捕获)
    [=, &foo] 除了foo变量是按引用捕获,其它变量按值捕获
    [bar]按值捕获bar变量
    [this]捕获当前类的this指针,让lambda函数体内可以访问对象的成员函数和成员变量

  4. lambda表达式按值捕获的一瞬间,值已经被复制到lambda表达式里了,后面再改值,不会影响lambda表达式!!可以按引用捕获可以解决这个问题

int a = 0;
auto f1 = [a] { return a; };
auto f2 = [&a] { return a; };

a++;
std::cout << f1() << std::endl;    // 输出0!!!
std::cout << f2() << std::endl;    // 输出1!!!
  1. 没有捕获变量的lambda表达式可以直接转换为函数指针,而捕获变量的lambda表达式无法转换为函数指针
using func_t = int(*)(int);
func_t f = [](int a) { return a;};  // OK
func_t f2 = [=](int a) { return a; };  // error,有状态的lambda不能直接转换为函数指针
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值