Memahami Keperluan untuk "Mutable" dalam C 11 Lambda Capture-by-Value
Ekspresi Lambda dalam C 11 menawarkan dua mod tangkapan: tangkap-dengan-rujukan dan tangkap-dengan-nilai. Apabila menangkap pembolehubah mengikut nilai, lambda boleh mengubah suainya. Walau bagaimanapun, tingkah laku ini tidak automatik. Kata kunci "boleh berubah" diperlukan untuk membenarkan pengubahsuaian.
Rasional Di Sebalik Keperluan "Mutable"
Satu perbezaan utama antara lambda dan fungsi bernama tradisional ialah lambda direka bentuk untuk merangkum satu set operasi yang beroperasi pada keadaan tempatan yang sementara. Secara lalai, keadaan ini harus kekal malar sepanjang pelaksanaan lambda.
Dengan membenarkan pengubahsuaian pembolehubah tangkapan demi nilai tanpa "boleh berubah", lambda akan melanggar prinsip penentuan fungsi. Lambda harus menghasilkan output yang sama setiap kali ia dipanggil, tanpa mengira keadaan kod sekeliling. Mengubah suai pembolehubah tangkapan demi nilai memperkenalkan bukan determinisme, menjadikan tingkah laku lambda sukar untuk diramalkan.
Memahami Tangkapan demi Nilai
Tangkapan demi nilai ialah direka untuk mencipta salinan tempatan pembolehubah yang ditangkap. Salinan ini bertujuan untuk tidak berubah, memastikan tingkah laku lambda kekal konsisten. Walau bagaimanapun, mungkin terdapat situasi di mana lambda perlu menukar salinan pembolehubah yang ditangkap.
Sebagai contoh, pertimbangkan kod berikut:
int main() { int n; [&](){n = 10;}(); // OK [=]() mutable {n = 20;}(); // OK // [=](){n = 10;}(); // Error: a by-value capture cannot be modified in a non-mutable lambda std::cout << n << "\n"; // "10" }
Tanpa "boleh berubah", tangkapan lambda -oleh-nilai tidak boleh mengubah suai salinan "n." Ini memastikan bahawa output kekal konsisten, walaupun pelaksanaan lambda mengubah suai pembolehubah "n" asal.
Dengan menggunakan "boleh ubah," kami secara jelas menunjukkan bahawa lambda dibenarkan mengubah suai salinan yang ditangkap. Ini membolehkan kami menukar salinan "n" dalam lambda tanpa menjejaskan kelakuan fungsi yang disertakan.
Atas ialah kandungan terperinci Mengapakah Kata Kunci `bolehubah` Diperlukan untuk Mengubah Suai Pembolehubah Ditangkap dalam C 11 Lambdas?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!