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

C++的lambda表达式捕获列表详解_C++值捕获、引用捕获与泛型lambda

尼克
发布: 2025-12-05 09:39:07
原创
492人浏览过
答案:C++中lambda表达式的捕获列表决定其对外部变量的访问方式,值捕获创建副本且默认不可修改,需mutable才能修改;引用捕获直接访问原变量但需注意生命周期;支持混合捕获和C++14的广义捕获初始化,如[ptr = std::make_unique(42)];泛型lambda结合auto参数与捕获机制,提升灵活性,适用于STL算法等场景。

c++的lambda表达式捕获列表详解_c++值捕获、引用捕获与泛型lambda

在C++中,lambda表达式是一种定义匿名函数的简洁方式,广泛用于算法、回调和函数对象的场景。其中,捕获列表(capture clause)是lambda表达式的关键部分,决定了lambda如何访问其定义作用域中的变量。本文将详细解析值捕获、引用捕获以及泛型lambda中的捕获机制。

值捕获(Capture by Value)

使用值捕获时,lambda会创建外部变量的副本,并在内部使用该副本。这意味着即使外部变量后续发生变化,lambda内部看到的仍是捕获时的值。

语法是在捕获列表中写变量名,或使用=表示默认按值捕获所有可访问的变量。

例如:

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

AiTxt 文案助手
AiTxt 文案助手

AiTxt 利用 Ai 帮助你生成您想要的一切文案,提升你的工作效率。

AiTxt 文案助手 98
查看详情 AiTxt 文案助手

int x = 10;
auto lambda = [x]() { return x; }; // 捕获x的值
x = 20;
std::cout

注意:值捕获的对象在lambda内部是const的,除非lambda声明为mutable

若需修改捕获的值,需加上mutable关键字:

auto lambda = [x]() mutable { x += 5; };

引用捕获(Capture by Reference)

引用捕获使lambda直接访问外部变量的引用,因此对变量的修改会影响原始变量,反之亦然。

语法是使用&前缀,或使用&作为默认捕获符。

例如:

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

int y = 15;
auto lambda = [&y]() { y *= 2; };
lambda();
std::cout

但要注意生命周期问题:如果lambda的生命周期超过被引用变量,调用它会导致未定义行为。例如,从函数返回一个引用捕获局部变量的lambda是危险的。

混合与特殊捕获方式

捕获列表支持组合使用多种捕获方式:

  • [x, &y]:x按值,y按引用
  • [=, &z]:默认值捕获,但z按引用
  • [&, x]:默认引用捕获,但x按值

C++14起支持捕获初始化(广义捕获),允许在捕获时创建新变量:

auto lambda = [ptr = std::make_unique(42)]() {
std::cout };

这在需要转移资源或封装复杂对象时非常有用。

泛型Lambda与捕获

C++14引入了泛型lambda,使用auto参数实现模板化行为。捕获机制与普通lambda一致,但结合泛型后更灵活。

例如:

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

auto generic_lambda = [val = 10](auto x) { return x + val; };

这里的val按值捕获,而参数x由调用时推导类型。

泛型lambda常用于STL算法中,配合不同类型的迭代器或函数对象。

基本上就这些。掌握捕获列表的规则,能让你写出更安全、高效的lambda表达式。关键是理解值与引用的区别,注意变量生命周期,合理使用默认捕获和广义捕获。

以上就是C++的lambda表达式捕获列表详解_C++值捕获、引用捕获与泛型lambda的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源: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号