1️⃣、使用条件
Lambda函数内部不能有:
- 静态变量 - static
- 堆区变量 - new/delete
- 异常捕获 - try/catch
- 虚函数 - virtual
2️⃣、使用方法
2.1、🛠️先定义后调用
2.1.1、定义方法
auto func = [](auto param) { // implicitly constexpr since C++17
return param++;
};
没见过C++lambda的朋友可能对上面的语句不明所以,但他其实等价于下面这个函数:
auto func(auto param) {
return param++;
}
返回类型(auto)之后、等号之前的,是函数名(func);圆括号内是外参(param)。
那多出来的方括号有什么用? 里面填什么?🤔
[capture clause] (parameters) mutable -> return-type { function body }
// 关键字mutable意义:
// 有,则函数体 function body 内 捕获变量capture caluse 可变;
// 无,则函数体 function body 内 捕获变量caputure caluse 常量
ret-type func = [capture clause] (parameters) mutable { function body }
方括号捕捉到的变量[capture clause],看上去似乎和圆括号的外参(parameters)没什么区别。但是方括号内是已赋值的变量,圆括号内是未赋值、必须在调用时赋值的形参。
值得一提的是,[ ] 和 ( ) 一样,若传递值则拷贝,若传递引用则可以直接访问其资源。具体案例参见文末推荐文章的“3.示例”部分
2.1.2、调用方法
Lambda函数和普通函数的调用方法也是一模一样的:
func(1); // 返回2
2.2、🛠️作为匿名函数使用
感觉和MATLAB的句柄函数有点像,既可以先定义后调用,也可以作为匿名函数。
constexpr auto func(auto i)
{
//use a lambda in constexpr context
return [i](auto j) { return i + j; }; // 匿名函数
}
推荐一篇讲解C++11 Lambda的文章,这篇文章比我讲得更加深入:C++11:lambda表达式_Man9Oo-GitCode 开源社区