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

Apakah Jenis Sebenar Ungkapan Lambda C 11?

Susan Sarandon
Lepaskan: 2024-12-10 10:06:12
asal
374 orang telah melayarinya

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 !
}
Salin selepas log masuk

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!

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