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

inj*_*joy 13 c++ lambda c++11

我有一个程序如下:

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;
}
Run Code Online (Sandbox Code Playgroud)

Xcode中存在编译错误:无法分配给非可变lambda中的副本捕获的变量.

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

Col*_*mbo 17

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

const 当且仅当lambda-expression的parameter-declaration-clause未后跟时,才声明此函数调用操作符或操作符模板(9.3.1) mutable.

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

auto add = [val] (int a) mutable -> int {
    val += 2;
    return a+val;
};
Run Code Online (Sandbox Code Playgroud)

所以const-specifier被删除了.


T.C*_*.C. 9

operator ()拉姆达的是含蓄const,除非拉姆达声明mutable-你不能修改数据成员的const成员函数.无论捕获类型如何,都会发生这种情况.


小智 6

只需通过引用捕获它,它就会起作用!!

 auto add = [&val](int a) -> int{ 
       //
}
Run Code Online (Sandbox Code Playgroud)

  • 拜托,没有人这样做。它会一直工作直到爆炸。 (5认同)
  • @Steazy 为什么它会爆炸? (3认同)
  • 如果“val”引用的对象超出范围,这将“爆炸”。例如,当您从函数返回 lambda 时,可能会出现这种情况。 (2认同)