首頁 >後端開發 >C++ >為什麼遞歸 Lambda 函數在使用「auto」時會失敗,但在使用完全指定的類型時會成功?

為什麼遞歸 Lambda 函數在使用「auto」時會失敗,但在使用完全指定的類型時會成功?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-12-14 21:39:16631瀏覽

Why Does a Recursive Lambda Function Fail with `auto` but Succeed with a Fully Specified Type?

使用 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,&amp;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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn