Capture Lambda mengikut Nilai, Rujukan dan Mutable
Pilih klausa capture dengan teliti dan fahami keadaan lambda.
Capture Lambda mengikut Nilai, Rujukan dan Mutable ialah pelajaran C++ Academy percuma di CoddyKit. Ini ialah pelajaran 2 daripada 4. Sebanyak 3 pelajaran dalam laluan pembelajaran ini boleh dibaca sepenuhnya secara percuma — selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan praktikal dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran C++ Academy, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus C++ Academy merangkumi sejumlah 4 pelajaran.
Rumusan Tangkapan
Klausa tangkapan lambda menyenaraikan pemboleh ubah daripada skop sekeliling yang boleh digunakannya. Mod tangkapan mengawal cara setiap pemboleh ubah dicapai.
Tangkapan Mengikut Nilai
Nama yang disenaraikan tanpa & disalin semasa lambda dicipta. Lambda memiliki salinannya sendiri.
int n = 5;
auto f = [n]() { return n * 2; };
n = 10;
std::cout << f(); // 10 (captured n was 5)Tangkapan Mengikut Rujukan
Nama dengan & disimpan sebagai rujukan kepada pemboleh ubah luar. Perubahan tersebar ke kedua-dua arah.
int counter = 0;
auto inc = [&counter]() { ++counter; };
inc(); inc();
std::cout << counter; // 2Tangkapan Lalai: =
[=] menangkap mengikut nilai segala yang digunakan dalam badan lambda. Mudah tetapi boleh mengejutkan — ia hanya menangkap pemboleh ubah yang dirujuk.
int a = 1, b = 2, c = 3;
auto f = [=]() { return a + c; }; // captures a and c (not b)Tangkapan Lalai: &
[&] menangkap mengikut rujukan segala yang digunakan. Berhati-hati — rujukan kepada pemboleh ubah tempatan menjadi tergantung jika lambda hidup melebihi skop.
int n = 0;
auto bad = [&]() { return n; };
return bad; // n dies, lambda danglesMenggabungkan Mod
Gabungkan tangkapan lalai dan khusus. Senaraikan pemboleh ubah individu untuk mengatasi tetapan lalai.
int a = 1, b = 2;
auto f = [=, &b]() { // a by value, b by reference
return a + b;
};Lambda Boleh Diubah
Pemboleh ubah yang ditangkap mengikut nilai ialah const di dalam lambda. Tambahkan mutable supaya lambda boleh mengubah salinannya yang ditangkap.
int n = 5;
auto inc = [n]() mutable {
++n;
return n;
};
inc(); inc();
std::cout << n; // 5 (outer unchanged)Tangkapan Awalan (C++14)
Tangkap hasil ungkapan dengan nama baharu. Ini membolehkan tangkapan melalui pemindahan dan nilai awal yang dikira.
auto ptr = std::make_unique<int>(42);
auto f = [p = std::move(ptr)]() {
return *p;
};
// ptr is now empty; p owns the int inside the lambdaMenangkap this
Di dalam fungsi ahli, [this] menangkap penuding this — semua ahli boleh dicapai di dalam lambda.
Menangkap *this (C++17)
[*this] menyalin keseluruhan objek ke dalam lambda. Berguna apabila lambda hidup lebih lama daripada objek asal.
Perangkap: Tangkapan Mengikut Rujukan dan Tak Segerak
Jangan sekali-kali menangkap pemboleh ubah tempatan mengikut rujukan ke dalam lambda yang berjalan secara tak segerak — pemboleh ubah tempatan berkemungkinan musnah sebelum lambda dijalankan.
// BUG
int local = 42;
std::async([&local]() { use(local); }); // local dies, lambda danglesSemakan Pantas
Mod tangkapan manakah yang betul supaya lambda memegang pemilikan std::unique_ptr daripada skop luar?
Rumusan
Tangkapan mengikut nilai menyalin, manakala tangkapan mengikut rujukan mencipta alias. Gunakan lalai [=] atau [&] dengan berhati-hati. mutable membenarkan salinan yang ditangkap mengikut nilai diubah. Tangkapan awalan (C++14) membolehkan tangkapan melalui pemindahan.
Pelajari C++ dengan tutor kecerdasan buatan — percuma
Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.
- Kursus
- 51
- Pelajaran
- 203
Soalan Lazim
Adakah pelajaran “Capture Lambda mengikut Nilai, Rujukan dan Mutable” percuma?
Ya — sebanyak 3 pelajaran dalam laluan pembelajaran C++ Academy, termasuk “Capture Lambda mengikut Nilai, Rujukan dan Mutable”, boleh dibaca sepenuhnya secara percuma di web ini. Selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan interaktif dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Kursus C++ Academy merangkumi sejumlah 4 pelajaran.
Apakah yang akan saya pelajari dalam “Capture Lambda mengikut Nilai, Rujukan dan Mutable”?
Pilih klausa capture dengan teliti dan fahami keadaan lambda. Anda berlatih C++ Academy menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.
Adakah saya memerlukan pengalaman untuk memulakan C++ Academy?
Tiada pengalaman terdahulu diperlukan. Pembelajaran C++ Academy di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 2 daripada 4.
Berapa lamakah pelajaran “Capture Lambda mengikut Nilai, Rujukan dan Mutable” diambil?
Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.
Bolehkah saya menulis dan menjalankan kod dalam pelajaran C++ Academy ini?
Ya. Setiap pelajaran C++ Academy menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.
Semua pelajaran dalam kursus ini
- Objek Fungsi dan Functor
- Capture Lambda mengikut Nilai, Rujukan dan Mutable
- Lambda Generik dan Closure C++14
- std::function: Boleh Dipanggil dengan Jenis Dipadam