Lambda 表达式是 C++ 引入的一种便捷的定义匿名函数对象的方式。它允许我们在需要函数对象的地方定义短小的函数,而不需要单独写一个函数或者函数对象类。
语法
[capture-list] (parameters) specifiers -> return-type { body }
capture-list(捕获列表)
[]:空捕获列表,不捕获任何变量[=]:以值方式捕获所有变量[&]:以引用方式捕获所有变量[x, &y]:捕获特定变量,x 为值捕获,y 为引用捕获[this]:捕获 this 指针[*this]:捕获当前对象的副本(C++17)
parameters(参数列表)[可选]
- 与普通函数的参数列表语法相同
- 如果不需要参数,可以省略
()
specifiers(说明符)[可选]
mutable:允许修改按值捕获的变量constexpr:声明为常量表达式(C++17)noexcept:指定是否抛出异常consteval:指定为即时函数(C++20)
return-type(返回类型)[可选]
- 使用
->符号指定 - 如果 body 只包含一个 return 语句,可以省略返回类型
- 如果 body 包含多个语句,且未指定返回类型,则由编译器推导
body(函数体)
- 包含在花括号中的函数实现代码
编译后
int multiplier = 10;
auto multiply = [multiplier](int x) { return x * multiplier; };
上述代码编译完后的产物为
class multiply {
private:
int multiplier_; // 捕获的变量
public:
// 构造函数,初始化捕获的变量
multiplyFun(int multiplier) : multiplier(multiplier_) {}
// 重载函数调用运算符
int operator()(int x) const {
return x * multiplier_;
}
};