C++ Lambda 表达式详解

Lambda 表达式是 C++11 引入的一种匿名函数机制,它允许你在需要函数的地方快速定义一个函数对象,常用于算法回调、异步编程等场景。


1. 基本语法

cpp

复制

下载

[capture](parameters) mutable -> return_type { body }
  • [capture]:捕获列表,指定如何捕获外部变量

  • (parameters):参数列表(可省略)

  • mutable:允许修改按值捕获的变量(可省略)

  • -> return_type:返回类型(可自动推导时可省略)

  • { body }:函数体


2. 捕获列表详解
捕获方式效果
[]不捕获任何外部变量
[=]按值捕获所有外部变量(默认 const,不可修改)
[&]按引用捕获所有外部变量
[x]仅按值捕获 x
[&x]仅按引用捕获 x
[=, &x]默认按值捕获,但 x 按引用捕获
[&, x]默认按引用捕获,但 x 按值捕获
[this]捕获当前类的 this 指针

3. 核心特性

(1) 自动类型推导

cpp

复制

下载

auto lambda = [](int a, int b) { return a + b; };

(2) mutable 关键字

cpp

复制

下载

int x = 1;
auto lambda = [x]() mutable { 
    x++;  // 允许修改按值捕获的副本
    return x; 
};

(3) 立即调用(IIFE)

cpp

复制

下载

int result = [](int a, int b) { return a * b; }(3, 4);  // 输出 12

4. 典型应用场景

(1) STL 算法回调

cpp

复制

下载

std::vector<int> v = {1, 2, 3};
std::sort(v.begin(), v.end(), [](int a, int b) {
    return a > b;  // 降序排序
});

(2) 异步编程

cpp

复制

下载

std::thread t([&]() {
    std::cout << "Running in thread\n";
});

(3) 延迟执行

cpp

复制

下载

auto logger = [msg = "Error!"]() { std::cerr << msg; };
if (error) logger();  // 按需调用

5. 注意事项
  1. 引用捕获的生命周期风险

    cpp

    复制

    下载

    auto get_lambda() {
        int x = 10;
        return [&x]() { return x; };  // x 已被销毁!
    }
  2. 默认捕获的潜在问题

    • [=] 可能意外捕获 this 指针(C++20 后需显式捕获)

  3. 性能考虑

    • 小规模捕获优先按值

    • 大规模数据考虑按引用(注意生命周期)


6. C++14/17/20 增强
  • C++14:支持泛型 Lambda

    cpp

    复制

    下载

    auto lambda = [](auto x) { return x * 2; };
  • C++17constexpr Lambda

    cpp

    复制

    下载

    constexpr auto sq = [](int x) { return x * x; };
    static_assert(sq(3) == 9);
  • C++20:模板 Lambda + 捕获 [*this]

    cpp

    复制

    下载

    auto lambda = []<typename T>(T x) { /*...*/ };

示例对比

cpp

复制

下载

// 传统函数对象
struct Adder {
    int offset;
    int operator()(int x) const { return x + offset; }
};
Adder add5{5};
add5(10);  // 返回 15

// Lambda 等效实现
auto add5 = [offset=5](int x) { return x + offset; };
add5(10);  // 返回 15

Lambda 提供了更简洁的语法来实现相同的功能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值