您的位置:首页 > 编程语言 > C语言/C++

C++中Lambda表达式浅析

2021-06-13 22:26 1251 查看

1. Lambda表达式

Lambda表达式是C++11最重要也是最常用的特性之一,是现代编程语言的一个特点,简洁,提高了代码的效率并且可以使程序更加灵活

Lambda表达式就是一个匿名函数,所谓匿名函数,那自然是没有名字的函数,当一个函数只是临时使用而且比较简单的时候,就可以采用Lambda表达式

Lambda表达式的语法格式如下:

当你不需要capture捕获的时候,就直接写一个框框

[]
当你不需要参数的时候,就直接写一个括号
()
当年不需要返回值的时候,不用写箭头
->
和ret(返回值类型)

[capture](params) opt -> ret {body;};
- capture: 捕获列表
- params: 参数列表
- opt: 函数选项
- ret: 返回值类型
- body: 函数体

// 示例代码->匿名函数的调用:
int ret = [](int a) -> int
{
return a+1;
}(100);

关于Lambda表达式的细节介绍:

  1. 捕获列表: 捕获一定范围内的变量
      []
      - 不捕捉任何变量
    • [&]
      - 捕获外部作用域中所有变量, 并作为引用在函数体内使用 (
      按引用捕获
      )
    • [=]
      - 捕获外部作用域中所有变量, 并作为副本在函数体内使用 (
      按值捕获
      ) 拷贝的副本在匿名函数体内部是只读的
  2. [=, &foo]
    - 按值捕获外部作用域中所有变量, 并按照引用捕获外部变量 foo
  3. [bar]
    - 按值捕获 bar 变量, 同时不捕获其他变量
  4. [&bar]
    - 按值捕获 bar 变量, 同时不捕获其他变量
  5. [this]
    - 捕获当前类中的this指针
      让lambda表达式拥有和当前类成员函数同样的访问权限
    • 如果已经使用了 & 或者 =, 默认添加此选项
  6. 参数列表: 和普通函数的参数列表一样
  7. opt 选项 -->
    可以省略
      mutable: 可以修改按值传递进来的拷贝(注意是能修改拷贝,而不是值本身)
    • exception: 指定函数抛出的异常,如抛出整数类型的异常,可以使用throw();
  8. 返回值类型:
      标识函数返回值的类型,当返回值为void,或者函数体中只有一处return的地方(此时编译器可以自动推断出返回值类型)时,这部分可以省略
  9. 函数体:
      函数的实现,这部分不能省略,但函数体可以为空。

2. 实列

下面实现一个最简单的lambda表达式,没有返回值,没有参数

[]()
{
cout << "这是lambda表达式" <<endl;
};

以上只是定义,如果要使用的话,在函数的末尾加上参数列表,代表要传的参数

比如这样

[]()
{
cout << "这是lambda表达式" <<endl;
}();

这样这个lambda表达式就会运行,如果有参数的话,底下那个括号要填参数,有返回值的话要有箭头和返回值类型,大概基础的部分就是这么多。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: