我正在阅读 B. Stroustrup 的《C++ 编程语言》,其第 11.4.3.4 节“可变 Lambdas”,其中内容如下:
通常,我们不想修改函数对象(闭包)的状态,所以默认情况下我们不能。也就是说,
operator()()生成的函数对象(第 11.4.1 节)是一个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
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5108 次 |
| 最近记录: |