2017-07-14 42 views
3

以下代码不能编译。因为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? 我想使第一个代码无需额外工作量即可工作。解决此问题的最佳做法是什么?

回答

6

除非拉姆达标记为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默认和选择可变性。

+0

谢谢!我需要将lambda对象存储在'的std ::˚F 'std :: move(packagedTask)]()mutable {pt();但是,如果使用'std :: package_task',lambda表达式不能被赋值:'std :: function f = [pt = std :: move };' – Viktor

+1

'std :: function'不支持可移动的可调用对象:https://stackoverflow.com/questions/25330716/move-only-version-of-stdfunction –

相关问题