CodeWalk

C++ Lambda表达式全面解析

作者:小字辈 · 2026-05-30 12:55

请说明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; }
};