首页 > 后端开发 > C++ > 正文

c++中lambda表达式的捕获列表是什么_c++ lambda捕获变量的规则与示例

穿越時空
发布: 2025-10-27 12:49:02
原创
730人浏览过
c++kquote>捕获列表决定lambda如何访问外部变量,[=]值捕获所有变量,[&]引用捕获所有变量,可混合使用如[=,&x],值捕获复制变量,引用捕获共享变量,引用需防悬空,修改值捕获需mutable关键字,常用于STL算法。

c++中lambda表达式的捕获列表是什么_c++ lambda捕获变量的规则与示例

在C++中,lambda表达式的捕获列表(capture list)用于指定lambda函数如何访问其所在作用域中的外部变量。捕获列表位于方括号 [] 中,决定了哪些局部变量可以被lambda使用,以及是以值还是引用的方式进行捕获。

捕获列表的基本语法与形式

捕获列表出现在lambda表达式的开头,格式如下:

[capture] () { ... }

常见的捕获方式包括:

  • [ ]:不捕获任何变量
  • [=]:以值的方式捕获所有外部变量(自动推导)
  • [&]:以引用的方式捕获所有外部变量
  • [x]:仅以值的方式捕获变量x
  • [&x]:仅以引用的方式捕获变量x
  • [this]:捕获当前对象的this指针(在类成员函数中使用)
  • [=, &x]:默认按值捕获,但x按引用捕获
  • [&, x]:默认按引用捕获,但x按值捕获

值捕获与引用捕获的区别

理解值捕获和引用捕获对程序行为的影响至关重要。

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

值捕获:在lambda创建时复制变量的值,后续即使原变量改变,lambda内部的副本也不会变化。

引用捕获:lambda内部操作的是原始变量的引用,原变量修改会影响lambda内的结果。

示例说明:

int x = 10;
auto byValue = [x]() { return x; };
auto byRef = [&x]() { return x; };
x = 20;
byValue(); // 返回 10
byRef(); // 返回 20

注意:如果引用捕获的变量在lambda调用时已超出作用域(如局部变量离开函数),会导致未定义行为。

千面视频动捕
千面视频动捕

千面视频动捕是一个AI视频动捕解决方案,专注于将视频中的人体关节二维信息转化为三维模型动作。

千面视频动捕 27
查看详情 千面视频动捕

混合捕获与特殊写法

实际开发中常需要灵活组合捕获方式。

例如:

int a = 1, b = 2, c = 3;
auto mixed = [=, &b](int x) {
a += x; // 错误!a是值捕获,默认情况下不能修改
b += x; // 正确,b是引用捕获
c += x; // 同样错误,c也是值捕获
};

若想修改值捕获的变量,需添加 mutable 关键字:

auto modifiable = [a, c]() mutable {
a++; // 可以修改,因为是mutable lambda
c++;
};

注意:即使加了mutable,修改的也只是副本,不影响原变量。

实际应用示例

常见用途之一是在STL算法中使用lambda:

#include <algorithm>
#include <vector>

std::vector<int> nums = {1, 2, 3, 4, 5};
int threshold = 3;

// 统计大于threshold的元素个数
int count = std::count_if(nums.begin(), nums.end(),
[threshold](int n) { return n > threshold; });

另一个例子:通过引用捕获累计结果:

int sum = 0;
std::for_each(nums.begin(), nums.end(),
[&sum](int n) { sum += n; });
// sum 现在等于 15

基本上就这些。掌握捕获列表的关键是清楚每种捕获方式的生命周期和访问权限,避免悬空引用,合理选择值或引用捕获。

以上就是c++++中lambda表达式的捕获列表是什么_c++ lambda捕获变量的规则与示例的详细内容,更多请关注php中文网其它相关文章!

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

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