关于C++14 lambdas的初始化捕获。

问题描述 投票:0回答:1

为什么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.
c++ c++11 c++14
1个回答
2
投票

在捕捉组中。

[&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.

© www.soinside.com 2019 - 2024. All rights reserved.