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

Why local variables in the lambda object are const?

本文关键字:常量 变量 局部变量 lambda 对象 为什么      更新时间:2023-10-16

以下代码无法编译。因为ptconst 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? 我想让第一段代码在没有变通办法开销的情况下工作。解决问题的最佳实践是什么?

除非 lambda 被标记为mutable,否则生成的lambda::operator()将被限定为const。将您的 lambda 标记为mutable将防止此行为:

auto function = [pt = std::move(packagedTask)]() mutable { (*pt)(); });

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

lambda 表达式生成的闭包中的局部变量不const。生成的lambda::operator()符合const.一个更好的问题可能是"为什么 lambda 的operator()隐式const

这是因为const是比mutable更好的默认值。可变性带来了复杂性。不可变性使代码更容易推理。

const应该是语言范围的默认值,但由于逆向兼容性,这是不可能的。由于 lambda 是一个全新的功能,委员会决定采用默认const选择加入可变性。