C++ lambda [],[=] ,[&],[this] 的使用

本文详细解释了C++11中lambda表达式中的四种捕获列表:[]表示不捕获任何外部变量,[=]按值捕获并创建副本,[&]按引用捕获可修改外部变量,[this]捕获当前对象。通过示例展示了它们在不同场景下的应用和限制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在c++11标准中引入了lambda表达式,一般用于定义匿名函数

 [],[=] ,[&],[this] 都是捕获列表

[] 的作用:  什么也不捕获

[=] 的作用:  按值捕获所有变量

[&] 的作用:  引用捕获所有外部作用域内的变量

[this]的作用: 捕获当前对象成员(类内Lambda)

1 [] 的demo

#include <iostream>
#include <string>
using namespace std;


int main() {
    // int a = 10;
    auto func =[](int b, int c){
        return b + c;
    };
    // 或者
    // auto func =[](int b, int c)-> int {cout<<"b+c = "<<b+c <<endl;};
    
    cout<<func(20,30)<<endl;

    return 0;
}

[] 是不能引用局部变量的如下

2 [=] 的demo

Lambda内部会创建外部变量的一个副本。对这些按值捕获的变量进行修改时,只会改变其副本的值,不会影响到原始的外部变量。使用 [=] 不能直接修改局部变量的原始值。

demo

#include <iostream>
#include <string>
using namespace std;


int main() {
    int a = 10;
    int b = 20;
    auto func =[=]{
        // ++a;
        cout<< "a = "<< a <<",b ="<< b<<endl;
    };
    
    func();
    // cout<< "a = "<<a<<",b ="<<b<<endl;
    return 0;
}

如果把修改局部变量的++a 放开是会报错的

[&] 表示按引用捕获 可以修改局部变量

Lambda 内部将获得一个指向外部变量的引用,所以对这些按引用捕获的变量进行修改时,会影响到原始的外部变量。因此,使用 [&] 可以直接修改局部变量的原始值。

#include <iostream>
#include <string>
using namespace std;


int main() {
    int a = 10;
    int b = 20;
    auto func =[&]{
        ++a;
        cout<< "a = "<< a <<",b ="<< b<<endl;
    };

    func();
    return 0;
}

总结

int a = 10;
auto lambda1 = [=]{ ++a; }; // 错误:尝试修改按值捕获的常量左值 'a'
auto lambda2 = [&]{ ++a; }; // 正确:按引用捕获,可以修改外部作用域中的 'a' 的值

[this] 捕获当前对象

#include <iostream>
#include <string>
using namespace std;

class Func{
    public:
        int x;
         Func(int val) : x(val) {}

    void doSomething(){
        auto lambda = [this]{ // 捕获this指针以访问成员变量x
            ++x;
            std::cout << "Inside lambda: x=" << x << std::endl;
        };
        lambda(); 
    }
         
};

int main() {
    Func func(10);

    func.doSomething();

    std::cout << "Outside lambda: obj.x=" << func.x << std::endl; // 对象成员x的值已改变
    return 0;
}

写这个博客主要是回顾知识的时候看到有些人记录这些组合 比如:[=, &a]

按照值,按照引用, 一个可以修改,可以不可以修改,这个感觉本身上语法就有一些矛盾,

大家看的挑选对自己有用的就行,不用刻意取较劲,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值