c++11 - 为什么在C++ 11中按值传递的lambda参数是只读的?

标签 c++11 lambda

当函数按值接受参数时,通常可以对其进行修改。但是,lambda似乎并非如此。为什么?

int main()
{
  int x = 0;
  auto lambda = [x] { x = 1; }; // error: assignment of read-only variable ‘x’
  return 0;
}

最佳答案

Herb Sutter回答了以下问题here


考虑这个稻草人的例子,程序员在其中捕获了本地
按值变量,并尝试修改捕获的值(这是一个
lambda对象的成员变量):


int val = 0;
auto x = [=](item e)            // look ma, [=] means explicit copy
            { use(e,++val); };  // error: count is const, need ‘mutable’
auto y = [val](item e)          // darnit, I really can’t get more explicit
            { use(e,++val); };  // same error: count is const, need ‘mutable’



出于用户的担心,似乎添加了此功能
可能没有意识到他得到了一份副本,尤其是因为lambdas
是可复制的,他可能正在更改其他Lambda的副本。


注意:这是更改功能的建议书。

关于c++11 - 为什么在C++ 11中按值传递的lambda参数是只读的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27714616/

相关文章:

c++ - 删除从析构函数调用的抛出析构函数

c++ - 我如何在 C++11 中定义负 UDL(它们是否被禁止?)?

Java 8 : Syntax for Implementing java. util.function.Function 作为 Lambda 表达式

java - 串行 Steam 的性能、内部工作和执行顺序

c++ - Lambda 回调取决于其参数

c++ - 使用仿函数或 lambda 的 vector 深度复制

c++ - 如何使用 std::copy 将一个 constexpr 数组复制到另一个 constexpr 数组?

c++ - 如何获取模板的类型,如模板 <typename T>,并检查 T 是 int 还是 float 还是类

java - 为什么我们不能在 lambda 表达式中使用默认方法?

c++ - 默认构造函数中的歧义