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

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

前几天我在研究 lambda 和 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 无关,常规函数也可以返回对已析构变量的引用。和 lambda 一样,它是未定义的行为,并且数字具有随机值和/或崩溃。

关于c++ - 为什么从 lambdas 创建的 std::functions 在捕获的变量超出范围后工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29859612/

相关文章:

c++ - 除了 XCode,如何在 OS X 上正确设置 googleTest

python - 谷歌云 ML 引擎中的 Tensorflow 新操作

c++ - 我应该总是使用 noexcept 作为 setter/getter 吗?

c# - 从 Expression<Func<IMyclass, int>> 创建 setter Expression<Action<object, object>>

Lambda 计划从 ArrayList 打印

java - 如何使用lambda在构造函数参数中实现 > 1 接口(interface)方法?

c++ - 创建树节点时 vtable 的 undefined reference

iphone - 在 Linux 上构建 LLVM

c++ - 将作用域枚举转换为 int

c++ - 每个进程的最大 std::shared_ptr 管理对象数