Dalam percubaan untuk mencipta lambda rekursif, anda mengalami ralat semasa menggunakan auto kata kunci untuk membuat kesimpulan jenis lambda. Walau bagaimanapun, apabila anda mengisytiharkan jenis lambda secara eksplisit sebagai fungsi std::, kod tersebut berjaya disusun.
Inferens Jenis Auto:
Apabila menggunakan auto, pengkompil membuat kesimpulan jenis lambda berdasarkan permulaannya. Walau bagaimanapun, untuk lambda rekursif, penutupan lambda perlu mengetahui jenis yang ditangkapnya (dalam kes ini, jumlah). Ini mewujudkan kebergantungan bulat, kerana jenis lambda bergantung pada jenis penutupannya, yang seterusnya bergantung pada jenis lambda.
Pengisytiharan Jenis Eksplisit:
Mengisytiharkan jenis lambda sebagai std::function
Fungsi Rekursif:
Segmen kod yang disemak:
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); };
menunjukkan bahawa fungsi lambda rekursif berdaya maju dengan sempurna dalam C 0x. Mereka hanya memerlukan pengisytiharan jenis eksplisit untuk mengatasi isu inferens jenis.
Atas ialah kandungan terperinci Mengapakah Lambda Rekursif Berfungsi dalam C 0x Memerlukan Pengisytiharan Jenis Eksplisit?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!