Lambda Positif: ' []{}' - Menyelidiki Perkara Yang Tidak Dijangka
Dalam percubaan untuk menyiasat sifat misteri ekspresi lambda , soalan "Mentakrifkan semula lambda tidak dibenarkan dalam C 11, mengapa?" timbul. Penemuan pelik oleh Johannes Schaub mendedahkan bahawa penambahan operator unary sebelum lambda awal membolehkan ia dikompil.
Pertanyaan:
Mengapa kod berikut dikompil tanpa ralat :
int main() { auto test = +[]{}; // Note the unary operator + before the lambda test = []{}; }
Adakah tingkah laku ini mengikut C standard?
Pembukaan:
Ya, kod itu mematuhi piawaian C. Pengendali mencetuskan penukaran lambda kepada penuding fungsi biasa.
Pembukaan:
Pengkompil mentafsir lambda awal ([]{}) dan mencipta objek penutupan. Memandangkan lambda ini tidak menangkap sebarang pembolehubah, fungsi penukaran wujud untuk menukar objek penutupan kepada penunjuk fungsi dengan parameter yang sama dan jenis kembali sebagai operator panggilan fungsi penutupan.
Penukaran ini sejajar dengan keperluan unary pengendali. Lebihan beban terbina dalam untuk termasuk yang menukar mana-mana jenis T kepada penuding kepada T. Jenis penutupan memenuhi keperluan ini dengan menyediakan penukaran kepada penuding fungsi.
Oleh itu, ujian auto ungkapan = []{ }; menyimpulkan jenis ujian menjadi batal(*)(). Ini membolehkan tugasan berikutnya dalam baris kedua, di mana objek lambda/penutupan kedua juga mengalami penukaran kepada penuding fungsi, menghasilkan tugasan yang serasi.
Kepentingan:
Tingkah laku luar biasa ini menyerlahkan kepelbagaian ekspresi lambda dan mekanisme rumit bahasa C. Ia membolehkan penugasan semula ungkapan lambda dengan menukarnya kepada penunjuk fungsi, menawarkan fleksibiliti dan kemungkinan pengoptimuman kod.
Atas ialah kandungan terperinci Mengapa Menambah Operator Unary ' ' Membenarkan Penugasan Semula Lambda dalam C ?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!