【问题标题】: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; } 另请参阅:stackoverflow.com/q/5501959

标签: c++11 lambda


【解决方案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 副本。

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

【讨论】:

  • 变了吗?
猜你喜欢
  • 1970-01-01
  • 2016-04-21
  • 2013-03-29
  • 2012-12-27
  • 2022-10-12
  • 2012-12-25
  • 1970-01-01
  • 1970-01-01
  • 2018-11-24
相关资源
最近更新 更多