我有一个程序如下:
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中的副本捕获的变量。
我的问题是:如果我们选择使用副本(使用“=”或值名称),是否不能为此值分配新值或更改?
答案 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{
//
}