Rumah > pembangunan bahagian belakang > C++ > Mengapakah `auto` Tidak Menyimpulkan Jenis Ungkapan Lambda sebagai Penunjuk Fungsi dalam C 11?

Mengapakah `auto` Tidak Menyimpulkan Jenis Ungkapan Lambda sebagai Penunjuk Fungsi dalam C 11?

Mary-Kate Olsen
Lepaskan: 2024-12-08 03:59:09
asal
297 orang telah melayarinya

Why Doesn't `auto` Deduce a Lambda Expression's Type as a Function Pointer in 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!
}
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan