Rumah > pembangunan bahagian belakang > C++ > Bilakah Kata Kunci `bolehubah` Diperlukan dalam C 11 Lambda Capture-by-Value?

Bilakah Kata Kunci `bolehubah` Diperlukan dalam C 11 Lambda Capture-by-Value?

DDD
Lepaskan: 2024-11-29 04:22:13
asal
685 orang telah melayarinya

When is the `mutable` Keyword Necessary in C  11 Lambda Capture-by-Value?

Menyelidiki C 11 Lambda Capture-by-Value: Membongkar Keperluan Kata Kunci "Mutable"

Dalam C 11, ungkapan lambda menyediakan mekanisme yang berkuasa untuk mencipta objek fungsi tanpa nama. Walau bagaimanapun, apabila menangkap mengikut nilai, kata kunci "boleh berubah" yang terkenal sering muncul, membuatkan pembangun tertanya-tanya tentang tujuannya.

Pertimbangkan coretan berikut:

#include <iostream>

int main() {
    int n;
    [&amp;](){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 kata kunci "boleh berubah" dalam lambda kedua, pengkompil melaporkan ralat. Timbul persoalan: mengapa kata kunci ini perlu?

Kontrak Tersirat Objek Fungsi

Ekspresi Lambda ialah contoh objek fungsi. Objek fungsi dijangka mematuhi prinsip asas pengaturcaraan berfungsi: ketelusan rujukan. Ini bermakna apabila dipanggil dengan set hujah yang sama, hasilnya hendaklah sentiasa sama.

Apabila menangkap mengikut nilai, ungkapan lambda mencipta salinan setempat pembolehubah. Walau bagaimanapun, ini menimbulkan masalah yang berpotensi. Jika lambda mengubah suai salinan, nilai pembolehubah asal mungkin berubah, melanggar prinsip ketelusan rujukan.

Menguatkuasakan Rujukan dengan "Mutable"

Kata kunci "mutable" melanggar kontrak tersirat ini. Dengan menyatakannya, pengkompil membenarkan ungkapan lambda mengubah suai nilai yang ditangkap. Ini memberikan pembangun kawalan eksplisit ke atas kebolehubahan dan kesan sampingan lambda.

Tanpa "boleh berubah", pengkompil menguatkuasakan ketelusan rujukan dengan menghalang lambda daripada mengubah suai mana-mana nilai yang ditangkap. Ini memastikan bahawa lambda sentiasa mengembalikan hasil yang sama untuk set argumen tertentu, menjadikannya objek fungsi sebenar.

Mencapai Imbangan

Kata kunci "boleh berubah" menyediakan keseimbangan yang diperlukan antara ketelusan rujukan dan fleksibiliti untuk mengubah suai nilai yang ditangkap. Ia membolehkan pembangun memilih sama ada lambda boleh menjejaskan dunia luar atau tidak.

Oleh itu, kata kunci "boleh berubah" dalam tangkapan demi nilai lambda bukan sekadar konvensyen, tetapi perlindungan penting yang memelihara sifat asas objek fungsi: tingkah laku yang boleh dipercayai dan boleh diramal.

Atas ialah kandungan terperinci Bilakah Kata Kunci `bolehubah` Diperlukan dalam C 11 Lambda Capture-by-Value?. 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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan