lambda表达式中可变关键字的混淆



在C++初级读本中,书中说如果我们想更改由值捕获的变量,我们应该添加"可变的";参数列表后面的缩写。然而,当我编写一些代码来测试这个规则时,我发现了一些问题。首先我写下面的代码:

//case1:
int val = 5;
auto f1 = [val]() mutable {return ++val;};
cout << f1() <<endl;
//case2:
int val = 5;
auto f2 = [val]() mutable {return val+5;};
cout << f2() <<endl;

我得到了预期的正确返回值。第一个代码块返回6,第二个返回10。然而,由于我想测试";可变的";关键字真的很有用,正如书中描述的那样,我删除了";可变的";两个代码块中的关键字。

//case1:
int val = 5;
auto f1 = [val]() {return ++val;};
cout << f1() <<endl;
//case2:
int val = 5;
auto f2 = [val]() {return val+5;};
cout << f2() <<endl;

不出所料,case1编译失败。然而,case2仍然可以编译成功并返回10我很困惑,不知道案件背后发生了什么。从案例1中;可变的";关键字真的很有用。然而,从案例2来看,尽管没有";可变的";,我还可以更改变量"val"的值。谁能告诉我发生了什么事?有什么我忽略的吗?

int val = 5;
auto f1 = [val]() mutable {return ++val;};
cout << f1() <<endl;

相当于:

int val = 5;
struct f1_t {
mutable int val;
f1_t(int v): val(v) {}
int operator()() const {return ++val;}
};
auto f1 = f1_t(val);
cout << f1() << endl;

++val正在增加val本身,这将改变val。但如果您执行val+5,所发生的一切都是创建一个值为10的临时int对象,然后返回,但val实际上从未更改,因此它完全有效。

相关内容

最新更新