Rumah >pembangunan bahagian belakang >C++ >Mengapa Menambah Operator Unary ' ' Membenarkan Penugasan Semula Lambda dalam C ?

Mengapa Menambah Operator Unary ' ' Membenarkan Penugasan Semula Lambda dalam C ?

DDD
DDDasal
2024-12-20 06:38:10202semak imbas

Why Does Adding a Unary

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!

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