【发布时间】:2012-02-28 19:07:09
【问题描述】:
假设我使用 lambda 作为回调函数,并且在创建 lambda 时,我通过引用捕获了一个局部函数变量。现在假设 lambda 对象直到该局部函数变量超出范围后才被执行。会发生什么?
我意识到,如果有可能发生这种情况,那么某人这样做是非常愚蠢的,但我几乎肯定有人最终会这样做。
【问题讨论】:
-
我不熟悉 c++11 但对于我使用过的任何其他语言,按定义捕获变量意味着只要它被捕获它就不会超出范围(有任何[间接]引用它)。
-
不在 C++ 中。返回通过引用捕获局部变量的 lambda 意味着一旦封闭函数返回,引用将不再有效。未定义的行为随之而来。
-
函数本身是静态的,因此总是有效的。但是
void (**)()可以 变得悬空。还有什么? -
@Joop,我认为提问者将函数指针存储到局部变量中并捕获该变量。即使函数指针可能仍然有效,对局部变量的引用也不会。
-
@RepDbg,在 C++11 中不会发生提升,悬空引用会导致未定义的行为。见stackoverflow.com/questions/6775174/…。