C++之lambda理解

简介

在C++ Primer中,是这样定义的-一个lambda表达式表示一个可调用的代码单元,可以将其理解为一个未命名的内联函数;与任何函数类似,一个lambda具有一个返回类型,一个参数列表和一个函数体,但和函数不同,lambda可能定义在函数内部。

形式

表达式规范如下:

其中

  • (1) 是完整的 lambda 表达式形式。
  • (2) const 类型的 lambda 表达式,该类型的表达式不能改捕获("capture")列表中的值。
  • (3) 省略了返回值类型的 lambda 表达式,但是该 lambda 表达式的返回类型可以按照下列规则推演出来:
    • 如果 lambda 代码块中包含了 return 语句,则该 lambda 表达式的返回类型由 return 语句的返回类型确定。
    • 如果没有 return 语句,则类似 void f(...) 函数。
  • (4) 省略了参数列表,类似于无参函数 f()。

使用

vector<string> arr;
auto arr_sort = (arr.begin(), arr.end(),[](const string &a, const string &b){
    return a.size() < b.size();
});

上面的函数实现的是比较字符串数组中的字符串,并返回是否较短;

但是上面的参数列表为空,也就是[]这里面为空,说明此lambda不使用它所在函数中的任何局部变量;

但是[]这里面的情况有多种,分别是:

  • [] 不截取任何变量
  • [&] 截取外部作用域中所有变量,并作为引用在函数体中使用
  • [=] 截取外部作用域中所有变量,并拷贝一份在函数体中使用
  • [=,&foo] 截取外部作用域中所有变量,并拷贝一份在函数体中使用,但是对foo变量进行引用
  • [bar] 截取bar变量并拷贝一份在函数体中使用,同时不截取其他变量
  • [this] 截取当前类中的指针,如果已经使用了&或者=就默认添加此选项

注意

  • 如果lambda的函数体包含任何单一return语句之外的内容,而且未指定返回类型,则返回void;
  • 和普通函数不同,lambda不能有默认参数,因此实参数目和形参数目相等;
  • 一个lambda只有在其捕获列表中捕获一个它所在函数中的局部变量,才能在函数体中使用该变量;
  • 捕获列表只用于局部(所在函数中)非static变量,lambda可以直接使用局部static变量和在它所在函数之外声明的名字;
原文地址:https://www.cnblogs.com/George1994/p/6399880.html