如何使可变 lambda 捕获列表的某些成员变得非常量

How to make const some members of a mutable lambda capture list?

本文关键字:成员 非常 常量 列表 lambda 何使可      更新时间:2023-10-16

mutable lambda 可以更改其捕获列表成员的值(按值捕获)。有没有办法让捕获列表中的某些成员在mutable lambda 中保持const

例如,我想更改i但在以下代码示例中的lambda正文中const j

#include <iostream>
int main()
{
    int i = 42;
    int j = 108;
    auto lambda = [i, j]() mutable
    {
        i = 15;
        std::cout << "i = " << i << std::endl;
        std::cout << "j = " << j << std::endl;
    };
    lambda();
}

由于简单捕获具有它们捕获的事物的精确、符合 cv 标准的类型,因此您可以使外部变量const,从而获得 const 捕获:

#include <iostream>
int main()
{
    const int i = 42;
//  ^^^^^
    int j = 108;
    auto lambda = [i, j]() mutable
    {
        i = 15;
        std::cout << "i = " << i << std::endl;
        std::cout << "j = " << j << std::endl;
    };
    lambda();
}

当然,如果你需要在某个时候修改外部变量,你需要先复制它 - 或者以某种方式重构你的代码,使其更整洁。