Rumah > pembangunan bahagian belakang > C++ > Bagaimana untuk Menangkap Pembolehubah Secara Eksplisit dalam Fungsi Lambda untuk Menyelesaikan Ralat Penyusunan?

Bagaimana untuk Menangkap Pembolehubah Secara Eksplisit dalam Fungsi Lambda untuk Menyelesaikan Ralat Penyusunan?

Mary-Kate Olsen
Lepaskan: 2024-10-23 18:23:01
asal
814 orang telah melayarinya

How to Explicitly Capture Variables in Lambda Functions to Resolve Compilation Errors?

Menangkap Pembolehubah dalam Fungsi Lambda

Apabila menggunakan ungkapan lambda dalam panggilan fungsi, menangkap pembolehubah daripada skop yang disertakan adalah penting. Dalam konteks ini, ketidakupayaan untuk menangkap pembolehubah secara tersirat boleh membawa kepada ralat kompilasi, seperti "ralat C3493: 'pembolehubah "tidak boleh ditangkap secara tersirat...'"

Pertimbangkan coretan kod berikut:

<code class="cpp">int flagId = _ChildToRemove->getId();
auto new_end = std::remove_if(m_FinalFlagsVec.begin(), m_FinalFlagsVec.end(),
        [](Flag& device) { return device.getId() == flagId; });

m_FinalFlagsVec.erase(new_end, m_FinalFlagsVec.end());</code>
Salin selepas log masuk

Kod ini cuba mengalih keluar elemen daripada vektor dalam C menggunakan fungsi lambda Lambda membandingkan medan ID setiap peranti dalam vektor m_FinalFlagsVec kepada flagId pembolehubah luaran, ID peranti yang akan menjadi. dialih keluar.

Walau bagaimanapun, pengkompil menimbulkan ralat yang dinyatakan di atas, menunjukkan bahawa pembolehubah flagId tidak disertakan dalam senarai tangkapan lambda untuk menyelesaikan isu ini, kami mesti menyatakan secara jelas pembolehubah yang hendak ditangkap daripada skop yang disertakan.

<code class="cpp">[flagId](Flag& device)
{
    return device.getId() == flagId;
}</code>
Salin selepas log masuk

Dengan memasukkan flagId dalam senarai tangkapan, kami menunjukkan bahawa lambda akan mengakses pembolehubah flagId daripada skop yang disertakan. Beberapa mod tangkapan tersedia:

  • <.>Mengikut nilai: Pembolehubah disalin ke dalam penutupan lambda, menjadikannya tidak boleh diubah dalam lambda.

    <code class="cpp">[flagId = std::as_const(flagId)](Flag& device)
    {
      // flagId is immutable within the lambda
    }</code>
    Salin selepas log masuk
  • Dengan rujukan: Pembolehubah dirujuk terus dalam lambda, membenarkan pengubahsuaian.

    <code class="cpp">[&flagId](Flag& device)
    {
      // flagId can be modified within the lambda
    }</code>
    Salin selepas log masuk
  • Dengan rujukan boleh ubah: Sama seperti tangkapan melalui rujukan, tetapi membenarkan lambda mengubah suai yang ditangkap pembolehubah.

    <code class="cpp">[mutable flagId](Flag& device)
    {
      // flagId can be modified within the lambda
    }</code>
    Salin selepas log masuk
Memilih mod tangkapan yang sesuai bergantung pada keperluan khusus fungsi lambda. Dengan menangkap pembolehubah secara eksplisit daripada skop yang disertakan, pembangun boleh memproses data dengan berkesan dalam ungkapan lambda, memastikan kod mereka kekal berfungsi dan bebas pepijat.

Atas ialah kandungan terperinci Bagaimana untuk Menangkap Pembolehubah Secara Eksplisit dalam Fungsi Lambda untuk Menyelesaikan Ralat Penyusunan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php
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