gpt4 book ai didi

c++ - 传递 std::shared_ptr 作为对 lambda 捕获列表的引用 (C++)

转载 作者:行者123 更新时间:2023-11-28 01:46:18 27 4
gpt4 key购买 nike

我需要对象从代码中的某个点开始一直存在,直到某个任务开始执行。就像在例子中:

shared_ptr<FromThisPointToTaskStart> ftptts = make_shared<FromThisPointToTaskStart>();
. . .
runningTask.then([ftptts](task<void> task)
{
. . .
try{
// Decrementing reference and deallocating object if ref count == 0;
ftptts = nullptr;
task.get();
}
}
// decrementing reference count so that it lives untill task starts
ftptts = nullptr;

问题是捕获列表将其捕获为常量,我无法更改它。做我想做的事的正确方法是什么?我应该像 [&ftptts] 一样传递它吗?

谢谢!

最佳答案

我已经测试了您的代码,结果如下:

  1. 将 std::shared_ptr 作为非引用传递将假设您不会更改该变量,但它的生命周期将延长到 .then{} block 结束,即使您没有在该 block 中使用它,然后在外部范围内将其设置为 nullptr。

  2. 将 std::shared_ptr 作为引用传递时,当您在周围范围内将其设置为 nullptr 时将释放对象,因此在 then block 中再次将其设置为 nullptr 后,您将获得异常。

  3. 您要求的解决方案是添加可变参数,尽管这会使所有其他参数也可变。

    runningTask.then([ftptts](task<void> task) mutable{...}

关于c++ - 传递 std::shared_ptr 作为对 lambda 捕获列表的引用 (C++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44945165/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com