首頁 >後端開發 >C++ >為什麼我的遞歸 Lambda 函數無法編譯,如何修復?

為什麼我的遞歸 Lambda 函數無法編譯,如何修復?

Patricia Arquette
Patricia Arquette原創
2024-12-13 13:46:11874瀏覽

Why Does My Recursive Lambda Function Fail to Compile, and How Can I Fix It?

解決遞歸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);
};

錯誤源自於無法使用「auto」初始化捕捉自身的lambda 函數。自動類型推斷無法確定 lambda 的返回類型,因為它取決於捕獲的變數。

要修正此問題,可以採取以下步驟:
  1. 使用完全指定的函數物件類型:

    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);
    };

    指定函數物件type 消除了自動類型推斷的需要,允許編譯器準確地確定返回類型。
  2. 稍後初始化函數物件:

    std::function<int(int, int)> sum;
    
    sum = [term, next, &amp;sum](int a, int b) -> int {
        if (a > b)
            return 0;
        else
            return term(a) + sum(next(a), b);
    };

    在沒有初始值的情況下初始化函數物件允許編譯器在賦值中推斷其類型聲明。

以上是為什麼我的遞歸 Lambda 函數無法編譯,如何修復?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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