[英]Why can't I change the value of a variable captured by copy in a lambda function?
我正在阅读 B. Stroustrup 的 C++ Programming Language 在其第 11.4.3.4 节“可变 Lambdas”中的内容,其中说:
通常,我们不想修改函数对象(闭包)的状态,所以默认情况下我们不能。 也就是说,生成的函数对象(第 11.4.1 节)的
operator()()
) 是一个const
成员函数。 万一我们想要修改状态(而不是修改通过引用捕获的某些变量的状态;第 11.4.3 节),我们可以声明 lambda mutable 。
我不明白为什么在按值捕获变量时operator()()
的默认值是const
。 这有什么道理? 当我更改复制到函数对象中的变量的值时会出现什么问题?
可以将 lambda 视为带有operator()()
,默认情况下,其定义为const
。 也就是说,它不能改变对象的状态。 因此,lambda 将作为一个常规函数运行并在每次调用时产生相同的结果。 相反,如果我们将 lambda 声明为可变的,则 lambda 可能会修改对象的内部状态,并根据该状态为不同的调用提供不同的结果。 这不是很直观,因此不鼓励。
例如,对于可变 lambda,这可能发生:
#include <iostream>
int main()
{
int n = 0;
auto lam = [=]() mutable {
n += 1;
return n;
};
std::cout << lam() << "\n"; // Prints 1
std::cout << n << "\n"; // Prints 0
std::cout << lam() << "\n"; // Prints 2
std::cout << n << "\n"; // Prints 0
}
更容易推理 const 数据。
通过默认 const,简短的 lamndas 更容易推理。 如果你想要可变性,你可以要求它。
std 中的许多函数对象都被复制了; 复制的 const 对象具有更简单的状态来跟踪。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.