Rumah >pembangunan bahagian belakang >C++ >Mengapa Fungsi Lambda Rekursif Gagal dengan `auto` tetapi Berjaya dengan Jenis Yang Ditentukan Penuh?
Fungsi Lambda Rekursif dengan Auto
Apabila cuba mentakrifkan fungsi lambda rekursif menggunakan kata kunci auto, anda mungkin menghadapi ralat kompilasi. Sebagai contoh, pertimbangkan fungsi lambda berikut:
auto sum = [term, next, &sum](int a, int b)mutable ->int { if(a>b) return 0; else return term(a) + sum(next(a),b); };
Kod ini akan mengakibatkan ralat berikut:
error: ‘`((<lambda(int, int)>*)this)-><lambda(int, int)>::sum`’ cannot be used as a function
Memahami Isu
Isu timbul kerana kata kunci auto menyimpulkan jenis fungsi lambda daripada permulaannya. Walau bagaimanapun, untuk fungsi lambda rekursif, penutupan lambda perlu mengetahui jenis yang ditangkapnya, iaitu masalah ayam-dan-telur.
Penyelesaian: Menggunakan Jenis Yang Ditentukan Penuh
Untuk menyelesaikan isu ini, anda boleh menentukan jenis fungsi lambda secara eksplisit menggunakan objek std::function. Contohnya:
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); };
Dalam kes ini, jenis fungsi lambda ditentukan sepenuhnya, jadi penutupan lambda boleh dimaklumkan sepenuhnya tentang jenis yang ditangkapnya.
Auto lwn. Jenis Ditentukan Sepenuhnya
Fungsi lambda rekursif serasi dengan sepenuhnya jenis yang ditentukan tetapi tidak dengan jenis inferens menggunakan auto. Ini kerana auto memerlukan permulaan untuk mempunyai jenis yang diketahui, manakala jenis yang ditentukan sepenuhnya tidak memerlukan pengetahuan ini.
Dengan menyatakan secara eksplisit jenis fungsi lambda rekursif anda, anda boleh mengelakkan ralat penyusunan dan memastikan bahawa penutupan lambda dimaklumkan dengan betul tentang jenis yang ditangkapnya.
Atas ialah kandungan terperinci Mengapa Fungsi Lambda Rekursif Gagal dengan `auto` tetapi Berjaya dengan Jenis Yang Ditentukan Penuh?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!