c++ - 在 lambda 中通过引用捕获的对象的生命周期

标签 c++ multithreading c++11 lambda lifetime

我有以下 c++ 代码。
Lambda 通过引用捕获 map 对象,并且能够在该 map 对象生命周期后访问它。

using VOID_VOID = std::function<void ()>;
using VOID_MAP = std::function<void (std::map<std::string, std::string> &)>;
using FUNC_MAP = std::function<VOID_VOID (std::map<std::string, std::string> &)>;

FUNC_MAP getLambda(VOID_MAP func)
{
    auto outer_lambda = [func](std::map<std::string, std::string> & m)->VOID_VOID {
        auto inner_lambda = [func, m]() mutable {
            m.erase("A");
            m["D"] = "4";
            func(m);
        };
        return inner_lambda;
    };
    return outer_lambda;
}

VOID_VOID test(FUNC_MAP f)
{
  std::map<std::string, std::string> m = {{"A","1"}, {"C","3"}, {"B","2"}};
  return f(m);
}

int main()
{
  auto a = [](std::map<std::string, std::string> &z){
    for(auto p:z)
      std::cout << p.first << ":" << p.second << "\n";
  };
  auto outer_lambda = getLambda(a);
  auto fut = std::async (test, outer_lambda);
  auto inner_lambda = fut.get();

  auto fut2 = std::async (inner_lambda);
  fut2.wait();
  return 0;
}

上面代码的输出是
B:2
C:3
D:4

由于 map 对象的生命mtest()函数,如何仍然可以从 inner_lambda 访问?它在哪里被引用捕获?

最佳答案

Since the life of map object m is test()


m的生命周期是定义它的 lambda 的生命周期(= 按值捕获它)。该 lambda 从 getLamda() 返回, 并传递给 std::async()inner_lambdamain() .所以,它在 fut2 future 。 wait()对 future 的 ing 执行 inner_lambda ,这会删除 A并添加 D ,并产生您看到的输出。

关于c++ - 在 lambda 中通过引用捕获的对象的生命周期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60473492/

相关文章:

c++ - 创建右值并通过转发将其传递给函数

c++ - C++ 中的运算符重载(复制构造函数和析构函数)

java - 如何使用具有 void 返回类型的 Callable?

c - 子线程中的信号处理程序

c - 如何通知工作线程有一些工作需要完成?

c++ - 通过 std::transform 将 std::map 展平为一个集合

c++ - C++的对称类数组数据结构

c++ - 从欧拉角到四元数和后退的 GLM 转换不成立

C++:如何随机生成不同数字的序列?

c++ - 如何减少C++中的查找时间