c++ - 为什么 lambda 的调用运算符隐式为 const?
问题描述
我在下面的函数中有一个小的“lambda 表达式”:
int main()
{
int x = 10;
auto lambda = [=] () { return x + 3; };
}
下面是为上述 lambda 表达式生成的“匿名闭包类”。
int main()
{
int x = 10;
class __lambda_3_19
{
public: inline /*constexpr */ int operator()() const
{
return x + 3;
}
private:
int x;
public: __lambda_3_19(int _x) : x{_x}
{}
};
__lambda_3_19 lambda = __lambda_3_19{x};
}
编译器生成的闭包“operator()”是隐式的 const。为什么标准委员会const
默认做出来?
解决方案
在 open-std.org 上找到 Herb Sutter 的这篇论文,讨论了这个问题。
奇怪的一对:按值捕获注入的 const 和古怪的可变
变量 考虑这个稻草人示例,程序员按值捕获局部变量并尝试修改捕获的值(它是 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’
添加此功能似乎是出于担心用户可能没有意识到他得到了副本,特别是由于 lambda 是可复制的,因此他可能会更改不同的 lambda 副本。
上面的引用和示例说明了为什么标准委员会可能默认设置它const
并要求mutable
对其进行更改。
推荐阅读
- python - 从特定行开始,如何继续它们的值,直到遇到具有更高值的行?
- node.js - Node.js 是否委托多线程?
- sql-server - MVC 5 - 处理 SQL Server .NET 客户端的已取消请求
- tensorflow.js - fromPixel 根据平台产生不同的张量
- c# - C# FCM:远程服务器返回错误:(400)错误请求
- c# - 在实体框架、ASP.NET-MVC 中保存通过外键(POST/PUT 请求)相关的实体
- python - 断言失败:脚本运行后 Flask 服务器停止
- angularjs - 单击时更改按钮文本的角度
- sql - Azure SQL Server SUM 查询随机超时
- fish - 有条件地在鱼中设置局部变量