以下代码无法编译。由于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
?
我想让第一个代码工作,而不需要管理工作量的开销。解决问题的最佳做法是什么?
答案 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
并选择加入可变性。