假设我使用lambda作为回调函数,并在创建lambda时通过引用捕获本地函数变量。现在假设lambda对象直到该本地函数变量超出范围后才执行。会发生什么?
我意识到如果存在这种可能性,有人这样做将非常愚蠢,但我几乎肯定会有人这样做。
是的,那将会引发悬垂引用问题。你似乎对接口设计感到担忧:"我几乎可以肯定有人会这么做。" 请不要因为这个理由而拒绝使用Lambda和std::function
,它们并没有比其他选择更危险。Lambda只是更简单的定义本地Functor的一种方式。std::function
是持久、多态Functor的最佳接口,无论Lambda是否存在。
作用域问题是为什么通过值捕获更容易。用户除非写&
,否则不会得到一个引用。当然,危险在于有些人会养成以[&]
开始他们所有的lambda函数的习惯,因为引用“更快”。希望这样的人很快就能吸取教训…尽管有些指针狂热者是无可救药的。
当你返回一个局部变量的引用时,发生的事情与此相同:未定义行为。
void (**)()
可能会成为悬空指针。还有什么别的? - Joop Eggen