C++_Lambda表达式

一段码字:

刚开始做东西的时候,看到难的东西,往往都是先复制粘贴,等事后再说。然后就没有了然后...

int mian(){
    int a = 1;
    int b = 2;
    auto func = [=,&b](int c)->int {return b += a+c}; // ???????????
    return 0;
}

语法

[捕获](参数列表) mutable ->return-type{statement}

捕获:是针对参数传入的关键字,它分值传递和引用两种方式

参数列表:和c语言一致

mutable:修饰符,默认情况Lambda是const函数,在添加mutable后,就会取消其常量属性。能对父作用域的成员变量做修改操作。如果是传值操父作用域的变量不起作用

int b = 1;
auto f3 = [=] () mutable{
    b = 99;
}; // 如果省略mutable,会出现编译错误。提示不能修改b值,因为它是const

->return-type:这是lambda函数的返回类型。主义这个是一体的,如果需要省略则全部省略。省略后,c++会自动推导返回类型,默认是int。

与普通函数最大的区别是,除了可以使用参数以外,Lambda函数还可以通过捕获列表访问一些上下文中的数据。具体地,捕获列表描述了上下文中哪些数据可以被lambda使用,以及使用方式(以值传递还是引用传递)。

常用的几种方式

1.[var] 表示值传递方式捕捉变量var;
2.[=]表示值传递方式捕捉所用父作用域的变量(包括this);
3.[&var]表示引用传递捕捉变量var;
4.[&]表示引用方式捕捉所有父作用域的变量(包括this)
5.[this]表示值传递方式捕捉当前的this指针

组合使用

1.[=,&a,&b]表示以引用传递的方式捕捉变量a和b,以值传递方式捕捉其它所有变量;
2.[&,a,this]表示以值传递的方式捕捉变量a和this,引用传递方式捕捉其它所有变量。

错误事例

1.[=,a]这里已经以值传递方式捕捉了所有变量,但是重复捕捉a了,会报错的;
2.[&,&this]这里&已经以引用传递方式捕捉了所有变量,再捕捉this也是一种重复。

参考链接

c++ 新特性 lambda
C++ Lambda表达式详解

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Lambda表达式C++11引入的一种函数对象,可以在需要函数对象的地方使用,比如作为函数参数、返回值等。Lambda表达式的语法形式如下: ``` [capture list](parameters) mutable exception -> return type { // function body } ``` 其中,`capture list` 表示捕获列表,用于捕获外部变量。`parameters` 表示函数参数列表,`mutable` 用于表示是否可以修改值传递的变量,`exception` 是异常列表,`return type` 表示返回类型,`function body` 则是函数体。 在Lambda表达式中,可以通过 `[this]` 捕获当前对象的指针,即 `this` 指针,可以方便地访问当前对象的成员变量和成员函数。例如: ``` class MyClass { public: void foo() { int x = 1; auto lambda = [this, x]() mutable { this->m_member_var += x; this->m_member_function(); x++; }; lambda(); } private: int m_member_var; void m_member_function(); }; ``` 在上面的例子中,Lambda表达式通过 `[this, x]` 捕获了当前对象的指针和 `foo()` 函数中定义的变量 `x`。在 Lambda 表达式中可以通过 `this->m_member_var` 和 `this->m_member_function()` 访问当前对象的成员变量和成员函数。由于 `x` 是值传递的,所以在 Lambda 表达式中需要使用 `mutable` 关键字使其可修改,可以通过 `x++` 修改变量的值。最后调用 `lambda()` 执行 Lambda 表达式。 需要注意的是,Lambda表达式捕获 `this` 指针时,需要保证当前对象是有效的,即不能在已经销毁的对象中访问成员变量和成员函数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值