假设我使用lambda作为回调函数,并且在创建lambda时,我通过引用捕获本地函数变量。现在假设在本地函数变量超出范围之后才会执行lambda对象。会发生什么?
我意识到,如果有机会发生这样做,那将是非常愚蠢的,但我几乎肯定会有人最终做到这一点。
答案 0 :(得分:16)
是的,那将是一个悬挂的参考。听起来你担心界面设计:“我几乎肯定会有人最终做到这一点。”请不要在此基础上拒绝lambdas和std::function
,因为它们并不比任何其他选择更危险。 Lambdas只是定义局部仿函数的一种更简单的方法。 std::function
是持久性多态仿函数的最佳接口,lambda与否。
范围问题是为什么按价值捕获更容易。除非他们写&
,否则用户将无法获得参考。当然,危险在于有人会养成用[&]
启动所有lambda函数的习惯,因为引用“更快”。希望任何这样的人都能尽快学到他们的教训......虽然一些指针快乐的人是不可救药的。
答案 1 :(得分:12)
返回对局部变量的引用时会发生同样的事情:未定义的行为。