Lambda初始化捕获的常量性问题:编译错误原因探究
Lambda初始化捕获与编译错误问题解析
先看你给出的代码:
const int x = 10; auto y = [x=x]() {++x;};
1. 初始化捕获会不会丢弃原变量的const限定符?
不会。[x=x]这种初始化捕获,是在Lambda的闭包内部创建一个新成员变量,用原const int x的值做初始化。这个闭包成员的类型默认是普通int(不是const)——原变量的const属性不会绑定到副本上,副本本身是具备可修改潜力的。
2. 编译报错的根源是什么?
确实如你所说,错误原因是没给Lambda加mutable关键字。
默认情况下,Lambda的调用运算符operator()是const成员函数,这就导致Lambda体内所有捕获的变量(包括初始化捕获的副本)都被当成const来对待,根本没法修改。哪怕副本本身是非const类型,在非mutable的Lambda里也碰不得。
给Lambda加上mutable后,调用运算符就不再是const的,这时就能正常修改捕获的副本了:
const int x = 10; auto y = [x=x]() mutable {++x;}; // 编译正常
总结一下:原变量的const属性和这个报错完全无关,问题出在Lambda默认的const限制上,加mutable就能解决。
内容的提问来源于stack exchange,提问作者Ayşenur Bolat
相关产品推荐
相关产品推荐

