为什么我不能在lambda函数中更改由copy复制的变量的值?

时间:2017-03-30 21:46:24

标签: c++ lambda

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

  

通常,我们不想修改函数对象的状态(   关闭),所以默认我们不能。也就是说,operator()()为   生成的函数对象(第11.4.1节)是const成员函数。 在   我们想要修改状态的不太可能的事件(而不是   修改引用捕获的某个变量的状态; §11.4.3)   我们可以声明lambda mutable

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

2 个答案:

答案 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对象具有更简单的跟踪状态。