我正在阅读B. Stroustrup在其第11.4.3.4节“可变Lambdas”中的C ++编程语言,其中包含以下内容:
通常,我们不想修改函数对象的状态( 关闭),所以默认我们不能。也就是说,
operator()()
为 生成的函数对象(第11.4.1节)是const
成员函数。 在 我们想要修改状态的不太可能的事件(而不是 修改引用捕获的某个变量的状态; §11.4.3) 我们可以声明lambda mutable 。
我不明白为什么当按值捕获变量时,operator()()
的默认值为const
。这是什么理由?当我将变量的值复制更改为函数对象时会出现什么问题?
答案 0 :(得分:3)
可以将lambdas视为具有operator()()
的类,默认情况下将其定义为const
。也就是说,它无法改变对象的状态。因此,lambda将表现为常规函数,并在每次调用时产生相同的结果。相反,如果我们将lambda声明为mutable,则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
}
答案 1 :(得分:0)
更容易推理const数据。
通过违约常规,简短的lamndas更容易推理。如果你想要可变性,你可以要求它。
std中的许多函数对象被复制;复制的const对象具有更简单的跟踪状态。