【问题标题】:What happens if I capture a local variable by reference, and it goes out of scope?如果我通过引用捕获局部变量并且超出范围会怎样?
【发布时间】:2012-02-28 19:07:09
【问题描述】:

假设我使用 lambda 作为回调函数,并且在创建 lambda 时,我通过引用捕获了一个局部函数变量。现在假设 lambda 对象直到该局部函数变量超出范围后才被执行。会发生什么?

我意识到,如果有可能发生这种情况,那么某人这样做是非常愚蠢的,但我几乎肯定有人最终会这样做。

【问题讨论】:

  • 我不熟悉 c++11 但对于我使用过的任何其他语言,按定义捕获变量意味着只要它被捕获它就不会超出范围(有任何[间接]引用它)。
  • 不在 C++ 中。返回通过引用捕获局部变量的 lambda 意味着一旦封闭函数返回,引用将不再有效。未定义的行为随之而来。
  • 函数本身是静态的,因此总是有效的。但是void (**)() 可以 变得悬空。还有什么?
  • @Joop,我认为提问者将函数指针存储到局部变量中并捕获该变量。即使函数指针可能仍然有效,对局部变量的引用也不会。
  • @RepDbg,在 C++11 中不会发生提升,悬空引用会导致未定义的行为。见stackoverflow.com/questions/6775174/…

标签: c++ lambda c++11


【解决方案1】:

是的,那将是一个悬空引用。听起来你很担心界面设计:“我几乎肯定有人最终会这样做。”请不要在此基础上拒绝 lambda 和 std::function,因为它们并不比任何其他替代方案更危险。 Lambda 只是定义局部函子的一种更简单的方法。 std::function 是持久化、多态函子(无论是否为 lambda)的最佳接口。

范围问题是为什么它更容易按价值捕获。除非他们写&,否则用户不会得到参考。当然,危险在于有人会养成使用 [&] 启动所有 lambda 函数的习惯,因为引用“更快”。希望任何这样的人能尽快吸取教训……尽管有些乐于助人的人是不可救药的。

【讨论】:

    【解决方案2】:

    当您返回对局部变量的引用时会发生同样的事情:未定义的行为。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-01-13
      • 2017-08-20
      • 2020-12-24
      • 2021-07-19
      • 2016-09-05
      • 2010-11-12
      • 1970-01-01
      相关资源
      最近更新 更多