Rumah >pembangunan bahagian belakang >C++ >Mengapa Fungsi Lambda Rekursif Gagal dengan `auto` tetapi Berjaya dengan Jenis Yang Ditentukan Penuh?

Mengapa Fungsi Lambda Rekursif Gagal dengan `auto` tetapi Berjaya dengan Jenis Yang Ditentukan Penuh?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-12-14 21:39:16628semak imbas

Why Does a Recursive Lambda Function Fail with `auto` but Succeed with a Fully Specified Type?

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,&amp;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!

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