Rumah >pembangunan bahagian belakang >C++ >Mengapakah `auto` Tidak Menyimpulkan Jenis Ungkapan Lambda sebagai Penunjuk Fungsi dalam C 11?
Menyahmistikan Potongan Jenis Lambda dengan "auto" dalam C 11
Di alam C 11, pengenalan ungkapan lambda telah menimbulkan persoalan mengenai jenis asasnya apabila disimpulkan menggunakan kata kunci "auto". Andaian bahawa jenis lambda ialah penuding fungsi terbukti tidak tepat, seperti yang ditunjukkan dalam coretan kod 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 menunjukkan percanggahan dalam potongan jenis antara penuding fungsi dan ungkapan lambda menggunakan "auto "kata kunci. Menariknya, pernyataan itu gagal, mendedahkan bahawa jenis lambda bukanlah penunjuk fungsi.
Menyingkap Sifat Sebenar Jenis Lambda
Untuk memahami paradoks yang jelas ini, adalah penting untuk menyedari bahawa jenis ungkapan lambda kekal tidak dinyatakan dalam C 11. Ia berfungsi sebagai binaan sintaksis yang menterjemah dengan lancar kepada functors. Dalam penukaran ini, elemen yang disertakan dalam kurungan segi empat sama ("[]") menjadi parameter pembina dan ahli kelas, manakala elemen dalam kurungan menjadi parameter untuk operator functor().
Terutamanya, lambda tanpa tangkapan berubah-ubah ( kurungan persegi kosong) mempunyai keupayaan untuk ditukar menjadi penunjuk fungsi, keupayaan yang tidak disokong oleh MSVC2010. Walau bagaimanapun, adalah penting untuk menekankan bahawa walaupun penukaran sedemikian mungkin, jenis lambda yang wujud ialah jenis functor yang tidak ditentukan.
Kesimpulan
"auto " kata kunci menawarkan kemudahan dalam potongan jenis, tetapi adalah penting untuk membezakan jenis asas entiti bahasa yang berbeza. Dalam kes ungkapan lambda, sifat dan potensinya yang tidak ditentukan untuk penukaran kepada penunjuk fungsi (jika berkenaan) menyerlahkan fleksibiliti yang disediakan oleh C 11 sambil turut mengukuhkan kepentingan memahami nuansa bahasa yang rumit.
Atas ialah kandungan terperinci Mengapakah `auto` Tidak Menyimpulkan Jenis Ungkapan Lambda sebagai Penunjuk Fungsi dalam C 11?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!