Rumah >pembangunan bahagian belakang >C++ >Mengapakah Lambda Rekursif Berfungsi dalam C 0x Memerlukan Pengisytiharan Jenis Eksplisit?

Mengapakah Lambda Rekursif Berfungsi dalam C 0x Memerlukan Pengisytiharan Jenis Eksplisit?

Susan Sarandon
Susan Sarandonasal
2024-12-14 10:39:15935semak imbas

Why Does a Recursive Lambda Function in C  0x Require Explicit Type Declaration?

Fungsi Lambda Rekursif dalam C 0x

Ralat dan Penyelesaian

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.

Penaakulan

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 menyelesaikan masalah ini kerana objek fungsi itu sendiri tidak perlu "mengetahui" apa-apa tentang perkara yang diberikan kepadanya. Ini membolehkan penutupan lambda menangkap jenis yang sesuai tanpa bergantung pada inferens jenis.

Fungsi Rekursif:

Segmen kod yang disemak:

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

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!

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