为什么我无法更改 lambda 函数中通过复制捕获的变量的值?

Fra*_*uet 8 c++ lambda

我正在阅读 B. Stroustrup 的《C++ 编程语言》,其第 11.4.3.4 节“可变 Lambdas”,其中内容如下:

通常,我们不想修改函数对象(闭包)的状态,所以默认情况下我们不能。也就是说,operator()()生成的函数对象(第 11.4.1 节)是一个const成员函数。万一我们想要修改状态(而不是修改通过引用捕获的某些变量的状态;第 11.4.3 节),我们可以声明 lambda mutable

我不明白为什么默认值operator()()const通过值捕获变量时的。这样做的理由是什么?当我更改复制到函数对象中的变量的值时,可能会出现什么问题?

And*_*bis 7

人们可以将 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)