Lamada表达式是C++11最重要也是最常用的特性之一。Lamada来源于函数式编程的概念,也是现代编程语言的一个特点。
Lamada表达式定义
下图展示出了C++ Lamada表示的组成部分:
其中:
① 指明捕获列表
② 指明参数列表
③ mutable可选项。和常规的mutable用法类似,即当lamada表达式参数是const时,使用mutable可以取消这种const.
④ throw可选项。和常规的throw用法类似,即用于指明lamada函数体不会抛出异常。
⑤ 指定返回类型
⑥ Lamada函数体
根据上图定义一个完整的lamada表达式:
auto f = [](int a) throw() -> int { return a + 1; };
返回类型
很多时候lamada表达式的返回值类型是非常明显的,编译器可以根据return语句自动推导出返回类型,这个时候我们可以省略表达式的返回值定义:
auto x1 = [](int a) {return a + 1}; // OK: return type is int
但是,初始化列表不能用于返回值的自动推导:
auto x2 = [](int a) {return {a+1, a+2}; }; // error: 无法推导出返回值类型
捕获列表
lamada表达式可以通过捕获列表捕获一定范围内的变量:
[] 不捕获任何变量。
[&] 按引用捕获:捕获外部作用域中的所有变量,并作为引用在函数体中使用。
[=] 按值捕获:捕获外部作用域中的所有变量,并作为副本在函数体中使用。
[=, &foo] 按值捕获外部作用域中的所有变量,并按引用捕获foo变量。
[bar] 按值捕获bar变量,同时不捕获其他变量。
[this] 捕获lamada所在的当前类中的this指针,让lamada表达式拥有和当前类成员函数同样的访问权限。如果已经使用了&或=,就默认添加此选项。捕获this的目的是可以在lamada中使用当前类的成员函数和成员变量。
原文链接:https://blog.youkuaiyun.com/china_jeffery/article/details/80771158