为什么x的值更新为6,而y初始化为7?
谁能给我一些线索?
int x = 4;
auto y = [&r = x, x = x+1]()->int {
r += 2;
return x+2;
}(); // Updates ::x to 6, and initializes y to 7.
在捕捉组中。
[&r = x, x = x+1]
r
是一个 参考 到 x
因此,任何改变 r
反映在 x
. 另一方面,左手边 x
在捕获组中,是一个 拷贝 的 x+1
,其中右手边 x
来自于lambda之外。
由于混淆是来自于lambda捕获语法,与常规赋值语法不同,所以改变这个副本的名称,会让人更清楚发生了什么。
int x = 5;
auto y = [&r = x, x_copy = x+1]() ->int { // x_copy is 5
r += 2; // changes x
return x_copy + 2; // returns 7
}();
这相当于你的例子,所以你可以看到唯一的改变是: x
是通过 r
因此,它变成了 6
. 当地 x_copy
初始化为 5
,然后lambda返回 x_copy + 2
,也就是 7
.