Lambda Capture by Value: Memastikan Nilai Bukan Const Captured dalam C 0x
Apabila menangkap mengikut nilai dalam C 0x lambda expression, yang ditangkap nilai secara automatik dibuat malar. Ini boleh menjadi isu jika anda perlu mengubah suai nilai yang ditangkap dalam lambda.
Sebagai contoh, pertimbangkan lambda berikut yang menangkap struct foo mengikut nilai:
<code class="cpp">struct foo { bool operator() (const bool &a) { return a; } }; int main(int argc, char* argv[]) { foo afoo; auto bar = [=] () -> bool { afoo(true); }; return 0; }</code>
Kod ini akan tidak menyusun kerana kaedah operator() foo diisytiharkan sebagai const. Untuk membetulkan isu ini, anda boleh menjadikan kaedah operator() bukan const:
<code class="cpp">struct foo { bool operator() (bool &a) { return a; } };</code>
Walau bagaimanapun, ini bukan penyelesaian yang diingini. Dalam sesetengah kes, anda mungkin mahu menangkap nilai mengikut nilai tetapi masih memastikan ia tidak diubah suai dalam lambda.
Untuk mencapai ini, anda boleh menggunakan kata kunci boleh ubah. Dengan mengisytiharkan lambda sebagai [=] () boleh ubah -> bool, anda membenarkan lambda mengubah suai nilai yang ditangkap.
Contoh:
<code class="cpp">auto bar = [=] () mutable -> bool { afoo(true); };</code>
Dalam contoh ini, lambda kini boleh mengubah suai objek afoo yang ditangkap, walaupun walaupun ia ditangkap oleh nilai.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mengubah Suai Nilai yang Ditangkap dalam C 0x Lambdas Apabila Menangkap Mengikut Nilai?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!