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

时间:2015-04-25 00:27:53

标签: c++ c++11 lambda function-pointers

前几天我正在乱搞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';


}

1 个答案:

答案 0 :(得分:7)

这与lambdas无关,常规函数也可以返回对被破坏变量的引用。和lambda一样,它是未定义的行为,数字具有随机值和/或崩溃。