Rumah >pembangunan bahagian belakang >C++ >Apakah Jenis Sebenar Ungkapan Lambda C 11?

Apakah Jenis Sebenar Ungkapan Lambda C 11?

Susan Sarandon
Susan Sarandonasal
2024-12-10 10:06:12285semak imbas

What is the True Type of a C  11 Lambda Expression?

Inferens Jenis Lambda dengan "auto" dalam C 11

Jenis ungkapan lambda dalam C 11 tertakluk kepada perdebatan, dengan beberapa mempercayai ia sebagai penunjuk fungsi. Walau bagaimanapun, pertimbangkan demonstrasi 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 bercanggah dengan andaian bahawa lambdas mempunyai jenis penunjuk fungsi. Jadi, apakah sifat sebenar jenis mereka?

Menyingkap Identiti Sebenar Lambda

Bertentangan dengan kepercayaan popular, ungkapan lambda mempunyai jenis yang tidak ditentukan. Ia hanyalah kemudahan sintaksis untuk functors. Semasa penyusunan, lambda berubah menjadi functor:

  • Elemen dalam kurungan [] menjadi parameter pembina dan ahli objek functor.
  • Parameter yang disertakan dalam () ditukar menjadi parameter untuk operator functor().

Lambdas tanpa tangkapan berubah-ubah (kosong [] kurungan) secara teknikal boleh ditukar menjadi penunjuk fungsi. Walau bagaimanapun, penukaran ini tidak disokong oleh semua pengkompil (cth., MSVC2010).

Perbezaan Penting

Walaupun lambda yang menangkap tiada pembolehubah boleh bertindak sebagai penunjuk fungsi, jenis asasnya kekal tidak ditentukan. Ia bukan penunjuk fungsi sebaliknya jenis fungsi yang tidak ditentukan.

Atas ialah kandungan terperinci Apakah Jenis Sebenar Ungkapan Lambda 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