0

0

c++ lambda捕获列表用法 c++ [=]和[&]的区别【详解】

穿越時空

穿越時空

发布时间:2025-12-29 17:36:38

|

340人浏览过

|

来源于php中文网

原创

[=] 表示值捕获,外部变量被只读拷贝进闭包,安全但有拷贝开销,支持 mutable 修改副本;[&] 表示引用捕获,零拷贝但需确保变量生命周期长于 lambda;可混合捕获,且 [this] 捕获指针,[*this] 深拷贝对象。

c++ lambda捕获列表用法 c++ [=]和[&]的区别【详解】

[=] 表示值捕获(copy capture),lambda 体内访问的所有外部变量都会以值的方式被拷贝进闭包对象;

[&] 表示引用捕获(reference capture),所有外部变量都以引用方式绑定,lambda 内部操作的是原变量本身。

值捕获 [=]:安全但可能有拷贝开销

使用 [=] 时,编译器会自动将 lambda 中用到的外部变量(且未显式指定捕获方式的)以只读方式拷贝一份。即使原变量后续被修改或已析构,lambda 仍能安全访问其副本。

  • 默认是 const 拷贝,不能在 lambda 内修改捕获的变量(除非加 mutable)
  • 支持 mutable:[=]() mutable { x = 10; } —— 此时修改的是副本,不影响外部 x
  • 若变量类型不可拷贝(如 unique_ptr、某些 IO 对象),则 [=] 编译失败
  • 大型对象(如 vector、string)拷贝可能带来性能损耗

引用捕获 [&]:高效但需注意生命周期

[&] 让 lambda 直接持有外部变量的引用,不拷贝,读写都作用于原变量。

立即学习C++免费学习笔记(深入)”;

  • 可直接修改外部变量(无需 mutable)
  • 零拷贝开销,适合大对象或不可拷贝类型
  • 危险点:若 lambda 在外部变量销毁后被调用,就会引发悬空引用(undefined behavior)
  • 常见陷阱:把 [&] lambda 存入容器、传给异步函数、或返回给调用者,而外部作用域已结束

混合捕获:更精细的控制

可以混用 [=, &x] 或 [&, x] 等形式,明确指定部分变量按值、部分按引用:

  • [=, &y]:其余变量值捕获,y 引用捕获
  • [&, x]:其余变量引用捕获,x 值捕获
  • [x, &y]:仅捕获 x(值)、y(引用),其他变量不可见(推荐用于清晰意图)
  • 注意:不能同时以值和引用方式捕获同一个变量

捕获 this 和 *this 的区别

在类成员函数中:

  • [this]:捕获当前对象指针(可访问成员,包括私有),等价于按值捕获指针
  • [*this](C++17 起):按值捕获整个当前对象(深拷贝),lambda 内对成员的修改不影响原对象
  • [&] 也会捕获 this,但此时 this 是引用,访问成员仍是原对象

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

315

2023.08.02

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

523

2023.09.20

lambda表达式
lambda表达式

Lambda表达式是一种匿名函数的简洁表示方式,它可以在需要函数作为参数的地方使用,并提供了一种更简洁、更灵活的编码方式,其语法为“lambda 参数列表: 表达式”,参数列表是函数的参数,可以包含一个或多个参数,用逗号分隔,表达式是函数的执行体,用于定义函数的具体操作。本专题为大家提供lambda表达式相关的文章、下载、课程内容,供大家免费下载体验。

204

2023.09.15

python lambda函数
python lambda函数

本专题整合了python lambda函数用法详解,阅读专题下面的文章了解更多详细内容。

190

2025.11.08

Python lambda详解
Python lambda详解

本专题整合了Python lambda函数相关教程,阅读下面的文章了解更多详细内容。

47

2026.01.05

go语言闭包相关教程大全
go语言闭包相关教程大全

本专题整合了go语言闭包相关数据,阅读专题下面的文章了解更多相关内容。

133

2025.07.29

go语言闭包相关教程大全
go语言闭包相关教程大全

本专题整合了go语言闭包相关数据,阅读专题下面的文章了解更多相关内容。

133

2025.07.29

undefined是什么
undefined是什么

undefined是代表一个值或变量不存在或未定义的状态。它可以作为默认值来判断一个变量是否已经被赋值,也可以用于设置默认参数值。尽管在不同的编程语言中,undefined可能具有不同的含义和用法,但理解undefined的概念可以帮助我们更好地理解和编写程序。本专题为大家提供undefined相关的各种文章、以及下载和课程。

4762

2023.07.31

高德地图升级方法汇总
高德地图升级方法汇总

本专题整合了高德地图升级相关教程,阅读专题下面的文章了解更多详细内容。

9

2026.01.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 6.8万人学习

C 教程
C 教程

共75课时 | 4万人学习

C++教程
C++教程

共115课时 | 12.5万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号