如何在 lambdas 中修改值作为参数?

How to modify value as parameters in lambdas?

在我的程序中,我有一个这样的全局静态值: static bool done=false

通过这样的回调获取:

Library::CallbackType callback(bool& isDone, par1type& par1,....){
    return [&isDone,&par1,...](par0type par0){
        if(conditionTrue){
            doSomething();
        } else {
            thread([isDone,par1]()mutable{
                cleanUp();
                isDone=true;
            }).detach():
        }
    }
}

问题是当我调用代码时:

library->doCallback(callback(done,p1,...));

除了 done 的值没有像我预期的那样改变之外,它的代码通常可以正常工作。 那么,我错了什么?

        thread([isDone,par1]()mutable{

此线程正在按值捕获 isDone。这意味着当它将 isDone 设置为 true 时,它只会将原始 isDone 的副本设置为 true.

本线程也需要通过引用捕获它。而且,如果这是可变 lambda 的唯一原因,那么 mutable 也可以消失。

创建线程时,您正在按值捕获 isDone - 即 lambda 中的代码正在处理副本。 mutable 关键字不会改变这一点,它只会让您更改副本。

解决方法是通过引用捕获(然后你可以删除mutable):

thread([&isDone,par1](){...