lambda 表达式可以传递引用为什么需要引用捕获

  • 当 lambda 表达式被传递或存储在其他地方时,通过引用捕获可以确保它始终访问正确的外部变量。------ 引用捕获可以精确地控制被捕获的引用变量的作用域。
  • 如果一个 lambda 表达式被存储在一个容器中,并且在不同的时间点被调用,引用捕获可以确保它始终访问到预期的外部变量,而不是可能已经被销毁或改变的其他变量。
cpp 复制代码
std::vector<std::function<void()>> lambdas;

for (int i = 0; i < 5; ++i) {
    int y = i;
    // 后续调用这些 lambda 表达式时,它们访问到的是正确的y的值。
    lambdas.push_back([&y]() { std::cout << y; });
}
  • 外部变量的生命周期可能与 lambda 表达式的执行时间不完全匹配。通过引用捕获,可以更好地管理这种复杂的变量生命周期关系。例如,一个对象的成员函数可能创建一个 lambda 表达式并传递给另一个线程,同时希望这个 lambda 表达式能够访问该对象的成员变量。通过引用捕获,可以确保 lambda 表达式在对象的生命周期内正确地访问成员变量。

    cpp 复制代码
         class MyClass {
         public:
             int value;
             void startAsyncTask() {
                 // 创建 lambda 表达式并传递给另一个线程
                 std::thread t([this]() {
                     while (true) {
                         std::cout << value;
                         std::this_thread::sleep_for(std::chrono::seconds(1));
                     }
                 });
                 t.detach();
             }
         };
相关推荐
爱说实话41 分钟前
C# DependencyObject类、Visual类、UIElement类
开发语言·c#
智码未来学堂43 分钟前
C语言指针:打开通往内存世界的大门
c语言·开发语言
黎雁·泠崖44 分钟前
Java面向对象:对象数组核心+综合实战
java·开发语言
野生技术架构师1 小时前
2026最新最全Java 面试题大全(整理版)2000+ 面试题附答案详解
java·开发语言
南村群童欺我老无力.1 小时前
Flutter 框架跨平台鸿蒙开发 - 打造表情包制作器应用
开发语言·javascript·flutter·华为·harmonyos
学习3人组1 小时前
AI视觉Python方向专业技术名词
开发语言·人工智能·python
_OP_CHEN1 小时前
【算法基础篇】(四十八)突破 IO 与数值极限:快速读写 +__int128 实战指南
c++·算法·蓝桥杯·算法竞赛·快速读写·高精度算法·acm/icpc
黎雁·泠崖1 小时前
Java分支循环与数组核心知识总结篇
java·c语言·开发语言
派大鑫wink1 小时前
【Day36】EL 表达式与 JSTL 标签库:简化 JSP 开发
java·开发语言·jsp
玖釉-1 小时前
[Vulkan 实战] 深入解析 Vulkan Compute Shader:实现高效 N-Body 粒子模拟
c++·windows·图形渲染