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

C++ C++;捕获列表中的lambda拷贝值,c++,c++11,lambda,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; } intmain() { int-val=4; 自动添加=[val

我有一个计划如下:

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;
}
intmain()
{
int-val=4;
自动添加=[val](int a)->int{
val+=2;
返回a+val;
};

cout操作符()除非lambda声明为可变的,否则lambda的
是隐式的
const
——并且不能修改
const
成员函数中的数据成员。无论捕获的类型如何,都会发生这种情况。

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

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

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

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

因此,
常量
-说明符被删除。

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

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

请不要这样做。它会一直工作到爆炸。@Steazy为什么会爆炸?