Rumah >pembangunan bahagian belakang >C++ >Bagaimana untuk Menangkap Pembolehubah Luaran dengan Betul dalam Ungkapan Lambda?

Bagaimana untuk Menangkap Pembolehubah Luaran dengan Betul dalam Ungkapan Lambda?

DDD
DDDasal
2024-10-23 18:18:02644semak imbas

How to Correctly Capture External Variables in Lambda Expressions?

Ralat: Menangkap Pembolehubah Luaran dalam Ungkapan Lambda

Apabila menggunakan ungkapan lambda, adalah penting untuk menentukan cara pembolehubah luaran harus ditangkap. Dalam kod yang disediakan, ungkapan lambda dalam algoritma std::remove_if memerlukan akses kepada flagId pembolehubah luaran. Walau bagaimanapun, ralat yang dilaporkan menunjukkan bahawa mod tangkapan tiada.

Penyelesaian:

Untuk menangani isu ini, mod tangkapan mesti dinyatakan secara eksplisit menggunakan kurungan segi empat sama ([ ]). Ini membolehkan ungkapan lambda mengakses pembolehubah luaran dalam skopnya. Terdapat tiga mod tangkapan utama:

  • [&flagId]: Tangkap flagId dengan rujukan. Ini bermakna bahawa sebarang pengubahsuaian yang dibuat pada flagId di dalam lambda akan menjejaskan pembolehubah flagId asal.
  • [flagId]: Menangkap flagId mengikut nilai. Ini mencipta salinan tempatan flagId yang tidak boleh diubah suai di dalam lambda.
  • [=]: Menangkap semua pembolehubah luaran mengikut nilai. Ini menghasilkan salinan tempatan semua pembolehubah luaran.

Untuk kod yang disediakan, mod tangkapan yang sesuai adalah dengan rujukan, kerana ia perlu mengakses nilai flagId yang dikemas kini. Oleh itu, ungkapan lambda yang diperbetulkan ialah:

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

Dengan menentukan mod tangkapan, ungkapan lambda boleh mengakses flagId pembolehubah luaran dengan betul dan melaksanakan operasi yang diingini.

Atas ialah kandungan terperinci Bagaimana untuk Menangkap Pembolehubah Luaran dengan Betul dalam Ungkapan Lambda?. 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