主代码
//-----------------------------------说明一的代码
void fun0{
int t = 10;
auto loopFun = [=]() mutable{
t--;
}
timer.SetTimer(*timerHandle, loopFun, 1.0f, true);
}
//-------------------------------------说明二的代码
void SetTimer(FTimerHandle& InOutHandle, TFunction<void(void)>&& Callback, float InRate, bool InbLoop, float InFirstDelay = -1.f )
{
InternalSetTimer(InOutHandle, FTimerUnifiedDelegate(MoveTemp(Callback)), InRate, InbLoop, InFirstDelay);
}
说明一
C++ lambda 是struct值,存于栈
未加mutable时 t 不可变。加了 t 可变,不影响上级程序域。
lambda 拆解
void fun0(){
int t = 10;
struct loopFun_t
{
loopFun_t() {}
void operator()()
{
t--;
}
const int t = 10;
}
loopFun_t();
}
https://www.zhihu.com/question/25740516/answer/56820797 WZsayiie
说明二
TFunction<void(void)>&& Callback
,这个是右值引用,使用栈内存(临时内存)时的语法。
配合 MoveTemp 将右值引用的内存移动到需要保存的地方,省却了拷贝,清理。
UE4的TFunction 是 std::function,MoveTemp 是 std::move。
https://blog.csdn.net/fenghen777/article/details/46741995#commentBox
http://www.cnblogs.com/chezxiaoqiang/archive/2012/10/24/2736630.html
实现总结
lambda是栈内存程序域,在下次运行上级函数时必然被覆盖,但有了右值引用,将lambda的内存移到别的地方,下次运行时就覆盖不到了,这样原lambda有了独立程序域。