浅析C++11 lambda表达式用法

发布时间 2023-03-30 20:37:58作者: _Explosion!

Lambda表达式(匿名函数、Lambda函数)是现代C++在C ++ 11和更高版本中的一个新的语法糖,可以让我们快速便捷的创建一个函数。

[ capture-list ] ( params ) mutable exception attribute -> return-type { body }

capture-list:捕获列表,一般在Lambda表达式开头,捕获上下文中的变量,用逗号分隔。

params:参数列表,函数所需参数,写法同函数参数,但是不支持默认参数。若没有参数可连同"()"直接省略。

mutable:可变规格(修饰符),当捕获列表是以复制的形式捕获时,默认复制值为const,若指定mutable则可取消其常量性。

exception:异常说明,用于函数内部抛出异常。

attribute:声明属性。

return-type:返回值类型,可省略。

body:函数体。

捕获列表说明:lambda表达式的捕获列表精细控制了lambda表达式能够访问的外部变量,以及如何访问这些变量。

1).[]不捕获任何变量。

2).[&]以引用的方式捕获所有变量。

3).[=]以拷贝的方式捕获所有变量。

4).[=,&foo]按值捕获外部作用域中所有变量,并按引用捕获foo变量。

5).[var]表示值传递方式捕获变量var。

6).[this]捕获当前类中的this指针,让lambda表达式拥有和当前类成员函数同样的访问权限。如果已经使用了&或者=,就默认添加此选项。捕获this的目的是可以在lamda中使用当前类的成员函数和成员变量。

auto lambda_test = [] {std::cout << "Hello, World!\n";};
lambda_test();

上例将打印字符的lambda函数赋给了lambda_test,然后直接调用函数。运行可得到结果"Hello,World!"

Lambda应用场景:当我们需要使用一次性函数时我们可以直接使用lambda函数,避免工程文件定义过多的非常用函数。

 

参考文章:

https://paul.pub/cpp-lambda-function-bind/

https://blog.csdn.net/qq_37085158/article/details/124626913?spm=1001.2014.3001.5506