使用 Auto 的遞歸 Lambda 函數
嘗試使用 auto 關鍵字定義遞歸 Lambda 函數時,您可能會遇到編譯錯誤。例如,考慮以下lambda 函數:
auto sum = [term, next, &sum](int a, int b)mutable ->int { if(a>b) return 0; else return term(a) + sum(next(a),b); };
此程式碼將導致以下錯誤:
error: ‘`((<lambda(int, int)>*)this)-><lambda(int, int)>::sum`’ cannot be used as a function
理解問題
出現此問題的原因是auto 關鍵字從lambda 函數的初始化中推斷出其型別。然而,對於遞歸 lambda 函數,lambda 閉包需要知道它捕獲的類型,這是先有雞還是先有蛋的問題。
解決方案:使用完全指定的類型
要解決此問題,您可以使用 std::function 物件明確指定 lambda 函數的類型。例如:
std::function<int(int,int)> sum = [term,next,&sum](int a, int b)->int { if(a>b) return 0; else return term(a) + sum(next(a),b); };
在這種情況下,lambda 函數的類型已完全指定,因此 lambda 閉包可以完全了解其捕獲的類型。
Auto與完全指定類型
遞歸 lambda 函數與完全指定類型相容,但與使用的類型推斷不相容 汽車。這是因為 auto 要求初始化具有已知的類型,而完全指定的類型則不需要此知識。
透過明確指定遞歸 lambda 函數的類型,可以避免編譯錯誤並確保lambda 閉包被正確告知其捕獲的類型。
以上是為什麼遞歸 Lambda 函數在使用「auto」時會失敗,但在使用完全指定的類型時會成功?的詳細內容。更多資訊請關注PHP中文網其他相關文章!