c++lambda函数捕获外部所有变量及变量引用

在 C++ 中,Lambda 函数可以通过不同的捕获列表来捕获函数外部的所有变量及其引用。捕获列表 [=] 捕获所有变量的值,而捕获列表 [&] 捕获所有变量的引用。这两种捕获方式之间存在一些区别:

  1. 捕获方式

    • [=]:值捕获方式,Lambda 函数内部的所有变量都会以传值的方式被捕获,即复制一份变量的值。
    • [&]:引用捕获方式,Lambda 函数内部的所有变量都会以引用的方式被捕获,即直接引用原始变量。
  2. 修改原始变量

    • 使用值捕获方式的 Lambda 函数,对捕获的变量的修改不会影响到原始变量的值。
    • 使用引用捕获方式的 Lambda 函数,对捕获的变量的修改会直接影响到原始变量的值。
#include <iostream>

int main() {
    int x = 10;
    int y = 20;

    // 值捕获方式
    auto lambda1 = [=]() {
        std::cout << "值捕获方式:x = " << x << ", y = " << y << std::endl;
    };

    // 引用捕获方式
    auto lambda2 = [&]() {
        std::cout << "引用捕获方式:x = " << x << ", y = " << y << std::endl;
        // 修改捕获的变量值
        // 这里修改的是原始变量的值,会直接影响原始变量的值
        x = 100;
        y = 200;
    };

    // 调用 Lambda 函数
    lambda1();
    lambda2();

    // 输出修改后的变量值
    std::cout << "修改后的变量值:x = " << x << ", y = " << y << std::endl;

    return 0;
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C++ lambda函数是一种匿名函数,它可以在需要函数对象的地方使用。捕获列表是lambda函数的一部分,用于指定lambda函数中可以访问的外部变量捕获列表可以包含以下几种形式的捕获方式: 1. 值捕获(value capture):通过将外部变量复制到lambda函数中来捕获它们。使用方式是在捕获列表中使用变量名,例如:[x, y]。 2. 引用捕获(reference capture):通过引用外部变量捕获它们。使用方式是在捕获列表中使用变量名前加上&符号,例如:[&x, &y]。 3. 隐式捕获(implicit capture):可以根据上下文自动捕获外部变量。使用方式是在捕获列表中使用=表示值捕获,使用&表示引用捕获,例如:[=]、[&]。 4. 初始化捕获(init capture):可以在捕获列表中使用初始化语句来捕获外部变量。使用方式是在捕获列表中使用变量名和初始化语句,例如:[x = 10, y = std::move(z)]。 捕获列表的作用是将外部变量引入lambda函数的作用域中,使得lambda函数可以访问这些变量捕获方式的选择取决于你对变量的使用需求,例如是否需要修改变量的值、是否需要访问变量的最新值等。 需要注意的是,被捕获变量lambda函数中是只读的,除非使用mutable关键字来声明lambda函数为可变的,这样就可以修改被捕获变量的值了。 希望以上解释对你有帮助!如果你还有其他问题,请继续提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值