【问题标题】:Why local variables in the lambda object are const?为什么 lambda 对象中的局部变量是 const?
【发布时间】:2017-12-19 13:06:09
【问题描述】:

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

【问题讨论】:

    标签: c++ lambda c++14


    【解决方案1】:

    除非 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 应该是语言范围的默认值,但由于向后兼容,这是不可能更改的。由于 lambdas 是一个全新的功能,因此委员会决定默认使用 const 并选择加入可变性。

    【讨论】:

    • 谢谢!我需要将 lambda 对象存储在 std::function 中,但无法分配带有 std::package_task 的 lambda:std::function&lt;void()&gt; f = [pt = std::move(packagedTask)]() mutable { pt(); };
    • std::function 不支持仅移动可调用对象:stackoverflow.com/questions/25330716/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 2021-05-21
    • 1970-01-01
    • 2018-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多