Rumah >pembangunan bahagian belakang >C++ >Mengapa Fungsi Lambda Rekursif Saya Gagal Disusun, dan Bagaimana Saya Boleh Membetulkannya?

Mengapa Fungsi Lambda Rekursif Saya Gagal Disusun, dan Bagaimana Saya Boleh Membetulkannya?

Patricia Arquette
Patricia Arquetteasal
2024-12-13 13:46:11929semak imbas

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

Menyelesaikan Isu Penyusunan dengan Fungsi Lambda Rekursif

Dalam cuba mentakrifkan fungsi lambda rekursif, kod berikut gagal untuk disusun:

auto sum = [term,next,&sum](int a, int b)mutable ->int {
  if(a>b)
    return 0;
  else
    return term(a) + sum(next(a),b);
};

Ralat berpunca daripada ketidakupayaan untuk menggunakan "auto" apabila memulakan fungsi lambda yang menangkap dirinya sendiri. Inferens jenis automatik tidak dapat menentukan jenis pemulangan lambda, kerana ia bergantung pada pembolehubah yang ditangkap.

Untuk membetulkan isu ini, langkah berikut boleh diambil:

  1. Gunakan Jenis Objek Fungsi Yang Ditentukan Penuh:

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

    Menentukan fungsi jenis objek menghapuskan keperluan untuk inferens jenis auto, membenarkan pengkompil menentukan jenis pemulangan dengan tepat.

  2. Mulakan Objek Fungsi Kemudian:

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

    Memulakan objek fungsi tanpa nilai awal membolehkan pengkompil membuat kesimpulan jenisnya dalam tugasan kenyataan.

Atas ialah kandungan terperinci Mengapa Fungsi Lambda Rekursif Saya Gagal Disusun, dan Bagaimana Saya Boleh Membetulkannya?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn