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
Mary-Kate Olsenasal
2024-10-23 18:23:01823semak imbas

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>

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>

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>
  • Dengan rujukan: Pembolehubah dirujuk terus dalam lambda, membenarkan pengubahsuaian.

    <code class="cpp">[&flagId](Flag& device)
    {
      // flagId can be modified within the lambda
    }</code>
  • 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>
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!

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