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
Mary-Kate Olsenasal
2024-12-08 03:59:09292semak imbas

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!
}

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!

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