Rumah > pembangunan bahagian belakang > C++ > Mengapakah Kata Kunci `bolehubah` Diperlukan untuk Mengubah Suai Pembolehubah Ditangkap dalam C 11 Lambdas?

Mengapakah Kata Kunci `bolehubah` Diperlukan untuk Mengubah Suai Pembolehubah Ditangkap dalam C 11 Lambdas?

Barbara Streisand
Lepaskan: 2024-11-28 11:10:14
asal
717 orang telah melayarinya

Why Is the `mutable` Keyword Necessary for Modifying Captured Variables in C  11 Lambdas?

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"
}
Salin selepas log masuk

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!

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