Capture Lambda berdasarkan Nilai, Referensi, dan Mutable
Pilih klausa capture dengan cermat dan pahami keadaan lambda
Capture Lambda berdasarkan Nilai, Referensi, dan Mutable adalah pelajaran C++ Academy gratis di CoddyKit. Ini adalah pelajaran 2 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar C++ Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus C++ Academy mencakup 4 pelajaran total.
Rangkuman Penangkapan
Klausa penangkapan lambda mencantumkan variabel dari lingkup sekitarnya yang dapat digunakannya. Mode penangkapan menentukan cara setiap variabel diakses.
Penangkapan berdasarkan Nilai
Nama yang dicantumkan tanpa & disalin saat lambda dibuat. Lambda memiliki salinannya sendiri.
int n = 5;
auto f = [n]() { return n * 2; };
n = 10;
std::cout << f(); // 10 (captured n was 5)Penangkapan berdasarkan Referensi
Nama dengan & disimpan sebagai referensi ke variabel luar. Perubahan diteruskan ke kedua arah.
int counter = 0;
auto inc = [&counter]() { ++counter; };
inc(); inc();
std::cout << counter; // 2Penangkapan Bawaan: =
[=] menangkap berdasarkan nilai semua yang digunakan dalam isi lambda. Praktis, tetapi dapat mengejutkan — yang ditangkap hanyalah variabel yang dirujuk.
int a = 1, b = 2, c = 3;
auto f = [=]() { return a + c; }; // captures a and c (not b)Penangkapan Bawaan: &
[&] menangkap berdasarkan referensi semua yang digunakan. Berhati-hatilah — referensi ke variabel lokal menjadi menggantung jika lambda hidup lebih lama daripada lingkupnya.
int n = 0;
auto bad = [&]() { return n; };
return bad; // n dies, lambda danglesMencampur Mode
Gabungkan penangkapan bawaan dan penangkapan tertentu. Cantumkan variabel individual untuk mengganti perilaku bawaan.
int a = 1, b = 2;
auto f = [=, &b]() { // a by value, b by reference
return a + b;
};Lambda yang Dapat Diubah
Variabel yang ditangkap berdasarkan nilai bersifat const di dalam lambda. Tambahkan mutable agar lambda dapat mengubah salinan yang ditangkapnya.
int n = 5;
auto inc = [n]() mutable {
++n;
return n;
};
inc(); inc();
std::cout << n; // 5 (outer unchanged)Penangkapan Inisialisasi (C++14)
Tangkap hasil suatu ekspresi dengan nama baru. Ini memungkinkan penangkapan melalui pemindahan dan nilai awal yang dihitung.
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 anggota, [this] menangkap pointer this — semua anggota dapat diakses di dalam lambda.
Menangkap *this (C++17)
[*this] menyalin seluruh objek ke dalam lambda. Ini berguna ketika lambda hidup lebih lama daripada objek aslinya.
Jebakan: Penangkapan berdasarkan Referensi dan Asinkron
Jangan pernah menangkap variabel lokal berdasarkan referensi ke dalam lambda yang berjalan secara asinkron — variabel lokal tersebut kemungkinan sudah dihancurkan sebelum lambda dijalankan.
// BUG
int local = 42;
std::async([&local]() { use(local); }); // local dies, lambda danglesPemeriksaan Singkat
Mode penangkapan mana yang tepat agar lambda memiliki std::unique_ptr dari lingkup luar?
Rangkuman
Penangkapan berdasarkan nilai menyalin, sedangkan penangkapan berdasarkan referensi membuat alias. Gunakan penangkapan bawaan [=] atau [&] dengan hati-hati. mutable memungkinkan pengubahan salinan yang ditangkap berdasarkan nilai. Penangkapan inisialisasi (C++14) memungkinkan penangkapan melalui pemindahan.
Belajar C++ dengan tutor AI — gratis
Tulis dan jalankan kode asli di browser kamu, dapatkan bantuan instan dari tutor AI 24/7, dan lanjutkan di mana kamu tinggalkan di web atau aplikasi.
- Kursus
- 51
- Pelajaran
- 203
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Capture Lambda berdasarkan Nilai, Referensi, dan Mutable” gratis?
Ya — teks lengkap “Capture Lambda berdasarkan Nilai, Referensi, dan Mutable” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus C++ Academy, upgrade ke CoddyKit PRO. Kursus C++ Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Capture Lambda berdasarkan Nilai, Referensi, dan Mutable”?
Pilih klausa capture dengan cermat dan pahami keadaan lambda Kamu berlatih C++ Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai C++ Academy?
Tidak diperlukan pengalaman sebelumnya. C++ Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 2 dari 4.
Berapa lama pelajaran “Capture Lambda berdasarkan Nilai, Referensi, dan Mutable” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran C++ Academy ini?
Ya. Setiap pelajaran C++ Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Objek Fungsi dan Functor
- Capture Lambda berdasarkan Nilai, Referensi, dan Mutable
- Lambda Generik dan Closure C++14
- std::function: Callable dengan Penghapusan Tipe