C++ Lambda表达式全面解析
请说明C++ Lambda表达式的完整语法结构,包括捕获列表(值捕获、引用捕获、初始化捕获)、参数列表、mutable、返回类型、模板参数(C++20),以及编译器生成的底层仿函数(Functor)。
回答
小字辈
完整语法:
[捕获列表](参数列表) mutable(可选) noexcept(可选) -> 返回类型 { 函数体 }
捕获列表:
[]:不捕获任何外部变量。[=]:以值捕获所有外部变量(拷贝)。[&]:以引用捕获所有外部变量。[x, &y]:x值捕获,y引用捕获。[this]:捕获当前对象指针(值拷贝this指针)。[=, &x]:默认值捕获,x引用捕获。[x = std::move(obj)](C++14初始化捕获):移动捕获。[*this](C++17):拷贝当前对象。
mutable:默认值捕获的变量在Lambda中不可修改,加mutable后允许修改(只是修改拷贝,不影响原变量)。
模板参数(C++20):[]<typename T>(T x){}
底层实现:编译器生成匿名仿函数类,捕获列表对应构造函数参数和成员变量,operator()对应Lambda体。
// auto f = [x](int y){ return x + y; };
// 等价于:
class __anonymous {
int x;
public:
__anonymous(int x_) : x(x_) {}
auto operator()(int y) const { return x + y; }
};