为啥 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 函数没有 function<> 类型?
如何在标准函数 lambda c++ 11 中正确捕获参数包