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();
             }
         };
相关推荐
Severus_black12 分钟前
【C++初阶】list使用及相关实现,思路顺滑流畅!
c语言·数据结构·c++·stl·list
噢,我明白了33 分钟前
JAVA中的一些基础应用知识点
java·开发语言
时间的拾荒人2 小时前
Redis 入门详解:核心特性、重要文件与全局命令实战
开发语言·redis·面试
敲上瘾2 小时前
Qt Widgets入门:项目模板解析与Hello World
开发语言·数据库·c++·qt·ui·qt6.3
码途行者3 小时前
网站的SQL 注入:从攻击原理到防御措施
开发语言·sql·php
旖旎夜光3 小时前
【C++ 基础入门】C++ 多态(中):虚函数表、多态原理与动静绑定
开发语言·c++·笔记·学习
你看我名字4 小时前
产品参数昨天还对,今天已过期:数眼智能与大模型应用如何做资料版本校验
开发语言·架构
老秦包你会4 小时前
计算机网络第二课 ----Socket(套接字)编程预备
开发语言·计算机网络·php
旖旎夜光4 小时前
【C++ 基础入门】C++多态(下):单/多继承虚表、多态补充与 21 道高频题
开发语言·c++·笔记·学习
Wang's Blog14 小时前
Java 项目实战: 交友项目 - FastDFS:入门案例
java·开发语言·交友