捕获列表中的C++lambda复制值

C++ lambda copy value in capture-list

本文关键字:C++lambda 复制 列表      更新时间:2023-10-16

我有一个程序如下:

int main()
{
    int val = 4;
    auto add = [val](int a)->int{
        val += 2;
        return a+val;
    };
    cout << add(3) << endl;
    cout << val << endl;
    return 0;
}

Xcode中存在编译错误:无法在不可变lambda中为副本捕获的变量赋值。

我的问题是:如果我们选择使用副本(使用"="或值名称),这个值就不能被分配一个新值或更改吗?

在lambda内部,捕获的变量默认情况下是不可变的。这并不取决于捕获的变量或以任何方式捕获它们的方式。相反,闭包类型的函数调用操作符被声明为const:

此函数调用运算符或运算符模板声明为const(9.3.1)当且仅当lambda表达式参数声明子句后面没有mutable

因此,如果您想使捕获的变量在主体内可修改,只需将lambda更改为即可

auto add = [val] (int a) mutable -> int {
    val += 2;
    return a+val;
};

因此删除了CCD_ 4-说明符。

lambda的operator ()隐式为const,除非lambda声明为mutable-并且不能修改const成员函数中的数据成员。无论捕获的类型如何,都会发生这种情况。

只要通过引用捕获它,它就会工作!!

 auto add = [&val](int a) -> int{ 
       //
}