Rumah >pembangunan bahagian belakang >C++ >Mengapakah Kata Kunci `bolehubah` Diperlukan untuk Tangkapan mengikut Nilai dalam C 11 Lambdas?

Mengapakah Kata Kunci `bolehubah` Diperlukan untuk Tangkapan mengikut Nilai dalam C 11 Lambdas?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-12-07 00:04:111002semak imbas

Why is the `mutable` Keyword Necessary for Capture-by-Value in C  11 Lambdas?

Menerokai Keperluan C 11 Lambda untuk "boleh berubah" dalam Capture-by-Value

Dalam C 11, lambda yang ditangkap mengikut nilai adalah tidak boleh berubah dari segi fungsi, bermakna mereka tidak boleh mengubah suai nilai yang ditangkap secara lalai. Untuk meminda tingkah laku ini, kata kunci "boleh berubah" digunakan untuk membenarkan pengubahsuaian dalam skop lambda.

Pertimbangkan contoh berikut:

int main() {
    int n;
    [&]() { n = 10; }(); // OK, captures by reference

    [=]() mutable { n = 20; }(); // OK, captures by value with "mutable"

    // [=](){n = 10;}(); // Error, cannot modify by-value capture without "mutable"

    std::cout << n << "\n"; // Prints "10"
}

Persoalannya timbul: Mengapakah "boleh berubah" kata kunci yang diperlukan untuk tangkapan demi nilai?

Secara tradisinya, parameter yang dihantar kepada fungsi yang dinamakan boleh berubah secara tersirat, membenarkan pengubahsuaian dalam fungsi. Walau bagaimanapun, lambda menyediakan kedua-dua mekanisme tangkapan demi rujukan dan tangkapan demi nilai, yang memperkenalkan gelagat yang berbeza.

Secara lalai, tangkapan demi nilai mencipta salinan pembolehubah luaran dan lambda hanya boleh beroperasi pada nilai sementara ini. Tanpa "boleh berubah", sebarang percubaan untuk mengubah suai nilai yang ditangkap akan mengakibatkan ralat pengkompil, kerana ia melanggar prinsip kebolehubah untuk objek fungsi.

Oleh itu, kata kunci "boleh berubah" diperkenalkan untuk membenarkan pengubahsuaian secara eksplisit dalam lambda yang menangkap mengikut nilai. Ia memberi isyarat kepada pengkompil bahawa salinan yang ditangkap boleh dianggap sebagai boleh ubah, sekali gus kembali kepada tingkah laku seperti fungsi yang lebih tradisional.

Ringkasnya, kata kunci "boleh berubah" diperlukan untuk tangkapan demi nilai dalam C 11 lambdas kerana ia memastikan bahawa output objek fungsi kekal konsisten dengan inputnya, sambil membenarkan pengubahsuaian pada salinan yang ditangkap dalam lambda skop.

Atas ialah kandungan terperinci Mengapakah Kata Kunci `bolehubah` Diperlukan untuk Tangkapan mengikut Nilai dalam C 11 Lambdas?. 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