#include <iostream>
#include <functional>
using namespace std;
std::function<void(void)> makeLambda(int param)
{
return [¶m](){cout << param << endl;};
}
int main()
{
auto callback = makeLambda(5);
callback();
}
基于lambda description如下所示,它看起来程序将导致未定义的行为,因为在调用回调时,捕获的var,函数参数超出范围。但我发现它总能打印5。
我的g ++版本是gcc-4.9.1。
悬空参考
如果通过引用隐式或显式捕获实体,并且 在调用之后调用闭包对象的函数调用操作符 实体的生命周期已经结束,发生了未定义的行为。 C ++ 闭包不会延长捕获的引用的生命周期。
同样适用于捕获的对象的生命周期 这个指针。
为什么会起作用?
答案 0 :(得分:3)
如您所知,这是未定义的行为。任何事情都可能发生,包括出现在工作中。如果你改变编译器,改变标志,忘记做菜,或者一小时后起床,你可能会得到完全不同的结果。
作为示例,Clang prints 32767用于某些版本和标记集。