捕获列表中的C++lambda复制值
C++ lambda copy value in capture-list
我有一个程序如下:
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{
//
}
相关文章:
- 使lambda不可复制/不可移动
- 在 lambda 中锁定 std::shared_ptr 的复制操作
- 将参数传递给泛型 lambda 时复制构造函数不正确
- 如何确定捕获不可复制参数的 lambda 的类型?
- 复制分配C++相同类型的 lambda
- 为什么在直接初始化和赋值中传递 lambda 而不是在复制初始化中传递 lambda 时会编译?
- lambda[=] 上的复制值被另一个封装的 lambda[&] 阻止
- 是否可以避免将参数复制到 lambda 函数?
- 我的lambda在复制构建期间没有正确转换捕获的"this"
- 复制 std::vector,但将 lambda 应用于每个元素
- 可以使用默认参数复制包含 lambda 的 std::函数吗?
- 为什么通过复制捕获 lambda 具有与外部变量相同的地址
- 是否可以传递具有捕获的不可复制(移动)值的 lambda
- 未定义 Lambda 复制分配运算符
- C++不可复制的 lambda 的行为是可复制的
- 为什么我无法更改 lambda 函数中复制捕获的变量的值?
- 是否可以使用 lambda 初始化变量(删除复制 ctor 时)
- C++:如何从 lambda 中"un-capture"不可复制的内容(例如 unique_ptr)?
- 不可变的 lambda 函数:复制捕获的变量是否允许是 const
- 捕获列表中的C++lambda复制值