如果返回,lambda 运行 会超出范围吗

Will lambda run out of scope if returned

我有一个将函数或可调用对象作为输入的结构:

struct House {
  std::function<int()> colorSelector;
}

现在我这样赋值:

House getHouse() {
  House h;
  int color = 10;
  h.colorSelector = [&]() {
    return color;
  }
  return h;
}

我 运行 会涉及范围界定问题吗?如getHousereturns后,color(局部变量)会被销毁?

Will I run into scoping issue?

是的。

您的 lambda 通过引用捕获 color,在 getHouse returns 之后,堆栈展开,进一步访问 color 是未定义的行为。

您应该按值捕获 color 以避免此类问题。

h.colorSelector = [color]() {
  return color;
}

如果您需要引用同一个 color,也许您想在某处分配一个 std::shared_ptr<color>,然后捕获它的副本。