C++ c++ lambda

sumu · 2019年08月07日 · 47 次阅读

背景

自从c++ 11之后 c++ 引入了λ表达式(lambda表达式),可以实现闭包。提供了匿名函数,极大的方便了回调函数的编写。

语法

因为c++17,c++20中对lambda表达式的进行了补充,您可能会遇到 [ 捕获 ] <模板形参>(可选)(C++20) ( 形参 ) 说明符(可选) 异常说明 attr -> ret requires(可选)(C++20) { 函数体 } 但是本次我们仅仅介绍常用的四种形式,如下。

  • [ ] ()说明符 -> ret { } //第一种
  • [ ] ()-> ret { } //第二种
  • [ ] (){ } //第三种
  • [ ] { } //第四种

详细介绍

其中第一种形式是完整表达式,其中[]中为捕获列表,()为形参列表,说明符mutable ret为返回类型 {}为函数体。

  1. [] 没有使用任何函数对象参数。
  2. [=] 函数体内可以使用Lambda所在作用范围内所有可见的局部变量(包括Lambda所在类的this),并且是值传递方式(相当于编译器自动为我们按值传递了所有局部变量)。
  3. [&] 函数体内可以使用Lambda所在作用范围内所有可见的局部变量(包括Lambda所在类的this),并且是引用传递方式(相当于编译器自动为我们按引用传递了所有局部变量)。
  4. [this] 函数体内可以使用Lambda所在类中的成员变量。
  5. [a] 将a按值进行传递。按值进行传递时,函数体内不能修改传递进来的a的拷贝,因为默认情况下函数是const的。要修改传递进来的a的拷贝,可以添加mutable修饰符。
  6. [&a] 将a按引用进行传递。
  7. [a, &b] 将a按值进行传递,b按引用进行传递。
  8. [=,&a, &b] 除a和b按引用进行传递外,其他参数都按值进行传递。
  9. [&, a, b] 除a和b按值进行传递外,其他参数都按引用进行传递。

其中第二种形式省略了mutable,这样就不可以在函数体内对传进来的参数进行修改。

其中第三种形式省略了ret,编译器可以根据返回值来自动推导出返回值类型。

最后第四种形式省略了形参,如果没有形参就可以省略()。

暂无回复。
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册