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

在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]

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/458404.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言第二十弹---指针(四)

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】 指针 1、字符指针变量 2、数组指针变量 2.1、数组指针变量是什么&#xff1f; 2.2、数组指针变量怎么初始化 3、⼆维数组传参的本质 4、函数指针变量 4.1…

通过nginx学习linux进程名的修改

目录 1. 缘起2. 背景知识3. 源码分析3.1 准备工作3.2 设置进程名字 1. 缘起 在运行nginx的时候&#xff0c;用ps查看nginx的进程信息&#xff0c;可能的输出如下&#xff1a; root 42169 3105 0 16:51 ? 00:00:00 nginx: master process ./objs/nginx root …

Linux------命令行参数

目录 前言 一、main函数的参数 二、命令行控制实现计算器 三、实现touch指令 前言 当我们在命令行输入 ls -al &#xff0c;可以查看当前文件夹下所有文件的信息&#xff0c;还有其他的如rm&#xff0c;touch等指令&#xff0c;都可以帮我们完成相应的操作。 其实运行这些…

完蛋!我把AI喂吐了!

当我们用 RAG 构建一个知识库问答应用的时候&#xff0c;总是希望知识库里面灌的数据越多&#xff0c;问答的效果越好&#xff0c;事实真是如此吗&#xff1f;这篇文章给大家答案。 引言 在人工智能问答系统的发展中&#xff0c;RAG&#xff08;Retrieval-Augmented Generatio…

eclipse使用google的Java代码格式

插件下载地址 1.下载eclipse的插件 2.下载的jar包放到eclipse安装目录的dropins文件夹 D:\install_package\STS\sts-4.10.0.RELEASE\dropins&#xff13;.重启后设置 eclipse - windows - preference - java - code style - formatter -

『运维备忘录』之 HTTP 响应状态码速查

运维人员不仅要熟悉操作系统、服务器、网络等只是&#xff0c;甚至对于开发相关的也要有所了解。很多运维工作者可能一时半会记不住那么多命令、代码、方法、原理或者用法等等。这里我将结合自身工作&#xff0c;持续给大家更新运维工作所需要接触到的知识点&#xff0c;希望大…

【网页设计】春节页面背景模板

无偿下载地址&#xff1a;https://download.csdn.net/download/weixin_47040861/88811143 1.实现效果 2.代码 1.html <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content&q…

Logback - 日志框架

引言 在当今的企业级应用开发中&#xff0c;日志管理是一个不可或缺的部分。它不仅帮助我们进行错误跟踪&#xff0c;还能有效监控应用程序的运行状态&#xff0c;为性能优化提供数据支撑。Spring Boot作为一个简化Spring应用开发的框架&#xff0c;自带了强大的日志管理功能。…

算法练习-三数之和(思路+流程图+代码)

难度参考 难度&#xff1a;中等 分类&#xff1a;数组 难度与分类由我所参与的培训课程提供&#xff0c;但需要注意的是&#xff0c;难度与分类仅供参考。且所在课程未提供测试平台&#xff0c;故实现代码主要为自行测试的那种&#xff0c;以下内容均为个人笔记&#xff0c;旨在…

类型化数组

数字存储前置知识 计算机必须使用固定的位数来存储数字&#xff0c;无论存储的数字是大是小&#xff0c;在内存中占用的空间是固定的n位的无符号整数能表示的个数是2^n个 取值范围是0~2^n-1 举例&#xff1a;000 001 111 表示[0-8]n位的有符号整数能表示的个数是2^n个 取值范围…

【动态规划】【子数组划分】【前缀和】1977. 划分数字的方案数

作者推荐 【动态规划】【状态压缩】【2次选择】【广度搜索】1494. 并行课程 II 本文涉及知识点 动态规划汇总 C算法&#xff1a;前缀和、前缀乘积、前缀异或的原理、源码及测试用例 包括课程视频 LeetCode1977 划分数字的方案数 你写下了若干 正整数 &#xff0c;并将它们…

前端vite+vue3——自动化配置路由布局

文章目录 ⭐前言&#x1f496;vue3系列文章 ⭐ 自动化配置路由&#x1f496;引入vite版本自定义目录映射&#x1f496;自动化读取文件下的路由&#x1f496;main入口加载路由&#x1f496;入口app.vue配置&#x1f496;layout基础布局配置&#x1f496;效果 ⭐总结⭐结束 ⭐前言…