代码之家  ›  专栏  ›  技术社区  ›  Gustavo

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

  •  2
  • Gustavo  · 技术社区  · 7 年前

    这样的结构旨在存储在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 回复  |  直到 7 年前
        1
  •  4
  •   Yola    7 年前

    从…起 cppreference

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

    因此,根据 as-if rule ,预计编译器将生成代码,其行为类似于您确实拥有此副本,因此对象将保持活动状态。