为啥 lambda 参数在 C++11 中以只读方式传递?

Posted

技术标签:

【中文标题】为啥 lambda 参数在 C++11 中以只读方式传递?【英文标题】:Why are lambda arguments passed by value read-only in C++11?为什么 lambda 参数在 C++11 中以只读方式传递? 【发布时间】:2015-02-27 03:49:09 【问题描述】:

当一个函数通过值接受一个参数时,它通常可以修改它。然而,这似乎不是 lambdas 的情况。为什么?

int main()

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

【问题讨论】:

默认情况下,闭包的应用操作符是const。您仍然可以使用mutable 修改捕获的变量:[x]() mutable x = 1; 另请参阅:***.com/q/5501959 【参考方案1】:

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 副本。

注意:这是更改功能的提案文件。

【讨论】:

变了吗?

以上是关于为啥 lambda 参数在 C++11 中以只读方式传递?的主要内容,如果未能解决你的问题,请参考以下文章

在 C++11 中不允许重新定义 lambda,为啥?

为啥我不能在 C++11 中创建一个 lambda 向量(相同类型)?

为啥 c++11 中的 lambda 函数没有 f​​unction<> 类型?

如何在标准函数 lambda c++ 11 中正确捕获参数包

为啥将 lambda 用于非类型模板参数时 gcc 会失败?

C ++ 11 lambda函数-如何传递参数