假设我使用 lambda 作为回调函数,并且在创建 lambda 时,我通过引用捕获了一个局部函数变量。现在假设 lambda 对象直到该局部函数变量超出范围后才被执行。会发生什么?
我意识到,如果有可能发生这种情况,那么某人这样做是非常愚蠢的,但我几乎肯定有人最终会这样做。
最佳答案
是的,那将是一个悬空引用。听起来你很担心界面设计:“我几乎肯定有人最终会这样做。”请不要在此基础上拒绝 lambda 和 std::function
,因为它们并不比任何其他替代方案更危险。 Lambda 只是定义局部仿函数的一种更简单的方法。 std::function
是持久化、多态仿函数(无论是否为 lambda)的最佳接口(interface)。
范围问题是为什么它更容易按值(value)捕获。除非他们编写 &
,否则用户不会得到引用。当然,危险在于有人会养成使用 [&]
启动所有 lambda 函数的习惯,因为引用“更快”。希望任何这样的人能尽快吸取教训……尽管有些乐于助人的人是不可救药的。
关于c++ - 如果我通过引用捕获局部变量并且超出范围会怎样?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9488129/