美文网首页
2.Lambda表达式

2.Lambda表达式

作者: celusing | 来源:发表于2020-11-03 16:02 被阅读0次

1.可调用对象(callable object)

对于一个对象或者表达,如果可以使用调用运算符(),则称其为可调用的。
可调用对象种类:

  • 函数
  • 函数指针
  • 重载了()的类
  • lambda表达式

2.lambda表达式

lambda包括:返回类型、一个参数列表和一个函数体。形式如下:

[capture list] (parameter list) -> return type {function body}

其中:参数列表和返回类型可以忽略,但:捕获列表和函数体必须包含。

3.lambda的捕获和返回

lambda是一种函数对象,当编写一个lambda表达式后,编译器将该表达式翻译成一个未命名类的未命名对象,在lambda产生的类中含有一个重载的函数调用运算符。

  • 捕获引用
    lambda通过引用捕获变量时,编译器负责保证lambda执行时,引用对象确实存在。因此,编译器可以直接使用该引用而无需再lambda产生的类中将其存储位数据成员。
  • 捕获值
    相反,通过值捕获的变量被拷贝到lambda中。因此,这种lambda产生的类必须位每个值捕获的变量建立对应的数据成员,同时创建构造函数,利用捕获的变量的值来初始化数据成员。
  1. 显示捕获
值捕获:auto f = [v] {return v;};
引用捕获:auto f = [&v] {return v;};
  1. 隐式捕获
[&]:采用引用捕获方式
[=]:采用值捕获方式
  1. 混合捕获
    当混合使用隐式捕获和显示捕获时,捕获列表中的第一个元素必须是&或者=,后面显示列出,捕获的元素。

4.可变lambda

默认情况下,对于值捕获(值被拷贝)的变量,lambda不会改变其值。如果希望改变捕获的变量的值,则需要在参数列表首加上关键字mutable。引用捕获的变量,自然可以修改。

auto f = [v1] () mutable {return ++v1;};

相关文章

网友评论

      本文标题:2.Lambda表达式

      本文链接:https://www.haomeiwen.com/subject/flzbvktx.html