为什么lambda对象中的局部变量是const?
问题描述:
以下代码不能编译。因为pt
的类型为const std::packaged_task<void()>>
而operator()
不是const
。为什么lambda对象中的局部变量是const?
auto packagedTask = std::packaged_task<void()>>([]{});
auto future = packagedTask.get_future();
auto function = [pt = std::move(packagedTask)]{ (*pt)(); });
下面是解决方法:
auto packagedTask = std::make_shared<std::packaged_task<void()>>([]{});
auto future = packagedTask->get_future();
auto function = [pt = std::move(packagedTask)]{ (*pt)(); });
为什么在拉姆达对象局部变量const
? 我想使第一个代码无需额外工作量即可工作。解决此问题的最佳做法是什么?
答
除非拉姆达标记为mutable
,否则生成的lambda::operator()
将被限定为const
。标记您的lambda作为mutable
会阻止此行为:
auto function = [pt = std::move(packagedTask)]() mutable { (*pt)(); });
为什么在拉姆达对象局部变量
const
?由lambda表达式产生关闭
局部变量是不const
。这是生成的lambda::operator()
,其格式为const
。一个更好的问题可能是“为什么是一个lambda的operator()
隐含const
?
这是因为const
是一个更好的默认比mutable
。可变性增加了复杂性。不变性使得代码更易于推理。
const
应该是因为lambda是一个全新的功能,委员会决定采用const
默认和选择可变性。
谢谢!我需要将lambda对象存储在'的std ::˚F 'std :: move(packagedTask)]()mutable {pt();但是,如果使用'std :: package_task',lambda表达式不能被赋值:'std :: function f = [pt = std :: move };' –
Viktor
'std :: function'不支持可移动的可调用对象:https://stackoverflow.com/questions/25330716/move-only-version-of-stdfunction –