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

Vik*_*tor 3 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)(); });
Run Code Online (Sandbox Code Playgroud)

这是解决方法:

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

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

Vit*_*meo 6

除非将lambda标记为mutable,否则生成的内容lambda::operator()将被限定为const.将lambda标记为mutable可以防止此行为:

auto function = [pt = std::move(packagedTask)]() mutable { (*pt)(); });
Run Code Online (Sandbox Code Playgroud)

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

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

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

const应该是语言范围的默认值,但由于反向兼容性而无法更改.由于lambdas是一个全新的特征,委员会决定const采用默认和选择性可变性.