繁体   English   中英

为什么我不能更改由 lambda 函数中的副本捕获的变量的值?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM