为什么lambda对象中的局部变量是const?

时间:2017-07-14 12:17:41

标签: c++ lambda c++14

以下代码无法编译。由于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)(); });

以下是解决方法:

auto packagedTask = std::make_shared<std::packaged_task<void()>>([]{});
auto future = packagedTask->get_future();
auto function = [pt = std::move(packagedTask)]{ (*pt)(); });

为什么lambda对象中的局部变量是const? 我想让第一个代码工作,而不需要管理工作量的开销。解决问题的最佳做法是什么?

1 个答案:

答案 0 :(得分:6)

除非将lambda标记为 let currencyFormatter = NumberFormatter() currencyFormatter.numberStyle = .currency currencyFormatter.currencySymbol = "£" print("number == \(currencyFormatter.number(from: "£10.00,56".replacingOccurrences(of: currencyFormatter.currencyGroupingSeparator, with: "")))") //it will print as 1000.56 ,否则生成的mutable将被限定为lambda::operator()。将lambda标记为const将阻止此行为:

mutable
  

为什么lambda对象中的局部变量是auto function = [pt = std::move(packagedTask)]() mutable { (*pt)(); });

lambda表达式生成的闭包中的局部变量不是const。这是生成的const,其资格为lambda::operator()。一个更好的问题可能是“为什么lambda const隐含operator()

这是因为const是一个比const更好的默认值。可变性引入了复杂性。不可变性使代码更易于推理。

mutable应该是语言范围的默认值,但由于反向兼容性而无法更改。由于lambdas是一个全新的功能,委员会决定默认使用const并选择加入可变性。