Rumah >pembangunan bahagian belakang >C++ >Apakah Jenis Sebenar Ungkapan Lambda C 11?
Inferens Jenis Lambda dengan "auto" dalam C 11
Jenis ungkapan lambda dalam C 11 tertakluk kepada perdebatan, dengan beberapa mempercayai ia sebagai penunjuk fungsi. Walau bagaimanapun, pertimbangkan demonstrasi berikut:
#define LAMBDA [] (int i) -> long { return 0; } int main() { long (*pFptr)(int) = LAMBDA; // ok auto pAuto = LAMBDA; // ok assert(typeid(pFptr) == typeid(pAuto)); // assertion fails ! }
Kod ini bercanggah dengan andaian bahawa lambdas mempunyai jenis penunjuk fungsi. Jadi, apakah sifat sebenar jenis mereka?
Menyingkap Identiti Sebenar Lambda
Bertentangan dengan kepercayaan popular, ungkapan lambda mempunyai jenis yang tidak ditentukan. Ia hanyalah kemudahan sintaksis untuk functors. Semasa penyusunan, lambda berubah menjadi functor:
Lambdas tanpa tangkapan berubah-ubah (kosong [] kurungan) secara teknikal boleh ditukar menjadi penunjuk fungsi. Walau bagaimanapun, penukaran ini tidak disokong oleh semua pengkompil (cth., MSVC2010).
Perbezaan Penting
Walaupun lambda yang menangkap tiada pembolehubah boleh bertindak sebagai penunjuk fungsi, jenis asasnya kekal tidak ditentukan. Ia bukan penunjuk fungsi sebaliknya jenis fungsi yang tidak ditentukan.
Atas ialah kandungan terperinci Apakah Jenis Sebenar Ungkapan Lambda C 11?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!