将共享指针存储在lambda中以使其保持活动状态

时间:2018-02-14 07:51:50

标签: c++ c++11 lambda shared-ptr functor

这样的结构体应存储在lambda中:

struct MyStruct {
  void testfunction() {
    // Do something
  }
};

我想要的是从中构造一个共享指针并将该指针存储在lambda中:

auto ptr = std::make_shared<MyStruct>();
std::function<void()> caller = [ptr](){
  ptr->testFunction();
}

调用者对象被赋予一个函数并被该函数复制。 ptr对象超出范围。当我传递调用者对象时,共享指针是否仍然存在?

是否保证ptr存储在lambda中,只要调用者存在或被返回,对象就由该指针管理?如果我不调用testFunction,是否有任何编译器优化?

此问题特定于boost::asio问题,我想通过异步处理程序传递一些对象。

1 个答案:

答案 0 :(得分:4)

来自cppreference

  

如果lambda表达式通过副本捕获任何内容(隐式使用捕获子句[=]或使用不包含字符&amp;的捕获显式捕获,例如[a, b, c]),则闭包类型包括未命名的非静态数据成员,以未指定的顺序声明,包含所有捕获的实体的副本。

因此,根据as-if rule,您的编译器将生成代码,如果您真的拥有此副本,那么该代码将保持活动状态。