如果我通过引用捕获局部变量会发生什么,并且它超出范围?

时间:2012-02-28 19:07:10

标签: c++ lambda c++11

假设我使用lambda作为回调函数,并且在创建lambda时,我通过引用捕获本地函数变量。现在假设在本地函数变量超出范围之后才会执行lambda对象。会发生什么?

我意识到,如果有机会发生这样做,那将是非常愚蠢的,但我几乎肯定会有人最终做到这一点。

2 个答案:

答案 0 :(得分:16)

是的,那将是一个悬挂的参考。听起来你担心界面设计:“我几乎肯定会有人最终做到这一点。”请不要在此基础上拒绝lambdas和std::function,因为它们并不比任何其他选择更危险。 Lambdas只是定义局部仿函数的一种更简单的方法。 std::function是持久性多态仿函数的最佳接口,lambda与否。

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

答案 1 :(得分:12)

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