【问题标题】:Lifetime of an object captured by reference in lambda在 lambda 中通过引用捕获的对象的生命周期
【发布时间】:2020-06-13 20:13:37
【问题描述】:

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

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

由于地图对象m 的生命周期是test() 函数,如何仍可从通过引用捕获的inner_lambda 访问它?

【问题讨论】:

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


    【解决方案1】:

    由于地图对象 m 的生命周期是test()

    m 的生命周期是定义它的 lambda 的生命周期(= 通过值捕获它)。该 lambda 从 getLamda() 返回,并在 main() 中作为 inner_lambda 传递给 std::async()。所以,它在fut2 的未来中仍然存在并且很好。未来的wait()ing 执行inner_lambda,它会删除A 并添加D,并产生您看到的输出。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-11
      • 1970-01-01
      • 2019-12-18
      相关资源
      最近更新 更多