为什么 std::functions 在捕获的变量超出范围后从 lambdas 创建的工作?

Why do std::functions created from lambdas work after captured variables go out of scope?

前几天我在搞lambdas和std::functions,发现了一个奇怪的属性。它们在捕获的变量超出范围后仍然有效。

这里有一个例子来说明我的意思。

#include <iostream>
#include <functional>

std::function<void()> make_lambda()
{
    int a = 10;

    return [&a](){std::cout << a << std::endl;};
}

int main()
{

  auto fun = make_lambda();

  fun();

}

对我来说,这似乎是行不通的,a 是通过引用捕获的,引用已经消失了。

编辑:

好的。这个问题不仅与 lambada 有关,而且与所有在使用前删除的引用有关。

我的问题变了。我仍然会在大量使用堆栈时得到类似的行为,这一定会覆盖旧数据。这是我的新代码:

#include <iostream>

int& make()
{
int a = 10;


return a;
}

void flushStack(long long i)
{
  if (i == 0)
  {
return;
  }
  flushStack(i-1);
}

int main()
{

  int& i = make();


  std::cout << i++ << '\n';
  std::cout << i++ << '\n';
  std::cout << i++ << '\n';
  std::cout << i++ << '\n';
  std::cout << i++ << '\n';

  flushStack(5000000);

  std::cout << "\n\n\n";

  std::cout << i++ << '\n';
  std::cout << i++ << '\n';
  std::cout << i++ << '\n';
  std::cout << i++ << '\n';
  std::cout << i++ << '\n';


}

这与 lambda 无关,常规函数也可以 return 引用已析构的变量。和 lambda 一样,它是未定义的行为,并且数字具有随机值 and/or 崩溃。