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:
Gunakan Jenis Objek Fungsi Yang Ditentukan Penuh:
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); };
Menentukan fungsi jenis objek menghapuskan keperluan untuk inferens jenis auto, membenarkan pengkompil menentukan jenis pemulangan dengan tepat.
Mulakan Objek Fungsi Kemudian:
std::function<int(int, int)> sum; sum = [term, next, &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!