c++中的lambda表达式

完整格式

[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.youkuaiyun.com/xiaoyink/article/details/79348806

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值