捕获列表中的C ++ lambda拷贝值

时间:2014-09-13 21:13:56

标签: c++ c++11 lambda

我有一个程序如下:

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中的副本捕获的变量。

我的问题是:如果我们选择使用副本(使用“=”或值名称),是否不能为此值分配新值或更改?

3 个答案:

答案 0 :(得分:16)

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

  

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

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

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

所以删除了const - 说明符。

答案 1 :(得分:9)

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

答案 2 :(得分:3)

只需通过引用捕获它,它将工作!

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