2012-04-06 88 views
1

此代碼是否正確?通過引用遞歸拉姆達

std::function<int(int)> f = [&f](int n) -> int 
{ 
    return n <= 1 ? 1 : n * f(n - 1); 
}; 

int x = f(42); 

對象構造在作爲lambda引用傳遞之前是否存在任何潛在的問題?或者這個代碼絕對正確?

通過值捕獲f會導致msvc2010編譯器崩潰。

+0

遞歸沒什麼問題,但爲什麼要通過引用捕獲lambda? – JaredPar 2012-04-06 16:08:56

+1

@JaredPar否則它在msvc2010編譯器中崩潰:) – innochenti 2012-04-06 16:14:59

+3

@JaredPar:因爲如果他通過值捕獲它,當lambda創建時,他會得到一個函數對象的副本,BEFORE f被初始化?未定義的行爲 – 2012-04-06 16:16:21

回答

1

這應該很好,只要你按照lambdas中存儲的棧變量的引用規則。它是明確定義的C++ 11代碼。