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();
             }
         };
相关推荐
迷迭所归处5 分钟前
C++ —— 关于vector
开发语言·c++·算法
架构文摘JGWZ34 分钟前
Java 23 的12 个新特性!!
java·开发语言·学习
leon62535 分钟前
优化算法(一)—遗传算法(Genetic Algorithm)附MATLAB程序
开发语言·算法·matlab
CV工程师小林35 分钟前
【算法】BFS 系列之边权为 1 的最短路问题
数据结构·c++·算法·leetcode·宽度优先
white__ice1 小时前
2024.9.19
c++
天玑y2 小时前
算法设计与分析(背包问题
c++·经验分享·笔记·学习·算法·leetcode·蓝桥杯
锦亦之22332 小时前
QT+OSG+OSG-earth如何在窗口显示一个地球
开发语言·qt
我是苏苏2 小时前
Web开发:ABP框架2——入门级别的增删改查Demo
java·开发语言
姜太公钓鲸2332 小时前
c++ static(详解)
开发语言·c++
菜菜想进步2 小时前
内存管理(C++版)
c语言·开发语言·c++