以下代码无法编译.因为pt有类型const std::packaged_task<void()>>而operator()不是const.
auto packagedTask = std::packaged_task<void()>>([]{});
auto future = packagedTask.get_future();
auto function = [pt = std::move(packagedTask)]{ (*pt)(); });
Run Code Online (Sandbox Code Playgroud)
这是解决方法:
auto packagedTask = std::make_shared<std::packaged_task<void()>>([]{});
auto future = packagedTask->get_future();
auto function = [pt = std::move(packagedTask)]{ (*pt)(); });
Run Code Online (Sandbox Code Playgroud)
为什么lambda对象中的局部变量是const?我想让第一个代码工作,而不需要管理工作量的开销.解决问题的最佳做法是什么?
除非将lambda标记为mutable,否则生成的内容lambda::operator()将被限定为const.将lambda标记为mutable可以防止此行为:
auto function = [pt = std::move(packagedTask)]() mutable { (*pt)(); });
Run Code Online (Sandbox Code Playgroud)
为什么lambda对象中的局部变量是
const?
lambda表达式生成的闭包中的局部变量不是.这是生成的合格.一个更好的问题可能是"为什么一个lambda是隐含的?constlambda::operator()constoperator()const
这是因为它const是一个更好的默认值mutable.可变性引入了复杂性.不可变性使代码更易于推理.
const应该是语言范围的默认值,但由于反向兼容性而无法更改.由于lambdas是一个全新的特征,委员会决定const采用默认和选择性可变性.