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

Store shared pointer in lambda to keep it alive

这样的结构旨在存储在 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 问题,我想通过异步处理程序传递一些对象。

来自 cppreference

If the lambda-expression captures anything by copy (either implicitly with capture clause [=] or explicitly with a capture that does not include the character &, e.g. [a, b, c]), the closure type includes unnamed non-static data members, declared in unspecified order, that hold copies of all entities that were so captured.

因此,根据 as-if rule,您的编译器预计会生成代码,如果您确实拥有此副本,则该代码的行为将保持活动状态。