Menyahkod Operator " " Ajaib: Memahami " []{}" Lambda
Dalam pemerhatian yang membingungkan, awalan " " tunggal kepada ungkapan lambda dalam C secara ajaib membolehkan penugasan semulanya. Sihir yang penuh teka-teki ini menimbulkan persoalan: mengapa kod berikut berjaya disusun?
int main() { auto test = +[]{}; // The "+" operator casts a lambda to a function pointer test = []{}; }
Jawapannya terletak pada kedalaman piawai C yang tidak jelas. " " mencetuskan penukaran kepada penuding fungsi lama biasa untuk lambda. Lambda, kerana tidak menangkap, sememangnya mempunyai fungsi penukaran kepada penunjuk fungsi dengan tandatangan yang sama. Fungsi penukaran ini, seperti yang ditakrifkan dalam standard C, mengembalikan alamat fungsi yang berkelakuan sama dengan operator panggilan fungsi lambda.
Operator " " unary, apabila digunakan pada objek penutupan yang dijana oleh lambda, melibatkan satu set lebihan terbina dalam. Salah satu beban lampau ini menerima sebarang jenis penuding dan menukarnya kepada penuding fungsi. Penukaran jenis penutupan kepada penuding fungsi, satu-satunya fungsi calon yang terlebih beban, oleh itu diutamakan.
Oleh itu, jenis "ujian" dalam "ujian automatik = []{};" disimpulkan sebagai "void(*)()". Keserasian penunjuk fungsi ini membolehkan penetapan objek lambda/penutupan kedua untuk "menguji" walaupun jenis penutupannya berbeza.
Pengetahuan ini mendedahkan rahsia di sebalik kejayaan lambda " []{}". Dengan menghantar lambda ke penuding fungsi, ia memintas sekatan untuk mentakrifkan semula lambda, membuka kunci keupayaan untuk menetapkan objek lambda baharu.
Atas ialah kandungan terperinci Mengapakah ` []{}` Mendayakan Penugasan Semula Lambda dalam C ?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!