最近為了實現(xiàn)一個異步遍歷文件目錄的功能袜蚕,接觸到了lambda表達(dá)式的遞歸吧恃。
因為是異步的,所以沒法像普通的std::function做法那樣锰扶,先定義一個function,然后在lambda表達(dá)式里使用它寝受。
這種方式當(dāng)lambda表達(dá)式里的代碼運行的時候坷牛,之前定義的那個function對象早就析構(gòu)了,這樣就會導(dǎo)致崩潰很澄。
所以京闰,使用lambda表達(dá)式的時候,在異步的情況下甩苛,一定要注意所引用的變量的生命周期問題蹂楣。
stackoverflow上有人提供了兩種方法,一種是Y組合子讯蒲,這個復(fù)雜點痊土;另一種是使用兩個智能指針,實現(xiàn)起來稍微有那么一點不直觀墨林,但是可以很好的滿足我當(dāng)下的需求施戴,就使用了這種反浓。
上樣例:
auto recursiveFunc = std::make_shared<std::unique_ptr< std::function<int(int, int)> >>();
*recursiveFunc = std::make_unique<std::function<int(int, int)>>(
[=] (int a, int b){
return b == 0 ? a : (**recursiveFunc)(b, a%b);
}
);