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

Gus*_*avo 3 c++ lambda functor shared-ptr c++11

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

struct MyStruct {
  void testfunction() {
    // Do something
  }
};
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

这个问题特定于boost::asio我想使用异步处理程序传递一些对象的问题。

Yol*_*ola 5

来自cppreference

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

因此,根据as-if 规则,预计您的编译器将生成代码,其行为就像您确实拥有此副本一样,因此对象将保持活动状态。