C++ lambda:良好的参考与糟糕的参考

ath*_*hos 0 c++ lambda reference pass-by-reference

我正在观看CppCon 2015视频:为什么按价值捕捉是好的,而参考则是坏的.

在此输入图像描述

Arthur解释说,但是我没理解...... Arthur说一个错误的引用是指一个局部变量然后退出,但退出堆栈后应该清理并且局部变量消失了,那么问题是什么?

Bar*_*rry 6

BAD_increment_by返回一个闭包,其中包含一个引用y,但y在该函数返回时超出范围,因此它包含一个悬空引用.任何调用该闭包的尝试都是未定义的行为.

由于同样的原因,这是不好的:

int& BAD_copy(int x) { return x; }
Run Code Online (Sandbox Code Playgroud)

不好.


小智 5

我想尝试用另一种方式解释@Barry 的回答。

让我们写下里面发生的事情BAD_increment_by

  1. 有一个局部变量,y.
  2. y通过引用捕获 lambda 。这将创建一个名为 的引用y。好吧,它们碰巧有相同的名称,这很令人困惑......我们将第一个称为“值y”,第二个称为“引用y”。
  3. lambda 的主体使用引用y
  4. lambda 由 返回BAD_increment_by

从 回来后BAD_increment_by

  1. 价值y已不复存在。
  2. 引用y仍然指向值y...
  3. 等待!值y不存在!引用y指向不存在的东西!

当有人调用 lambda 时,

  1. 参考文献y已阅读。
  2. 由于引用y是引用,因此我们被重定向到值y
  3. 呃...它真的有价值y还是只是我的幻觉?

结论是:当调用 lambda 时,将使用悬空引用。该行为是未定义的。