Rumah > pembangunan bahagian belakang > C++ > Bagaimanakah Saya Boleh Mencapai Move Capture dalam C Lambdas, Terutamanya dalam C 11?

Bagaimanakah Saya Boleh Mencapai Move Capture dalam C Lambdas, Terutamanya dalam C 11?

Susan Sarandon
Lepaskan: 2024-12-10 14:51:10
asal
557 orang telah melayarinya

How Can I Achieve Move Capture in C   Lambdas, Especially in C  11?

Memahami Move Capture dalam C Lambdas

Dalam C 11, menangkap pembolehubah dalam lambdas biasanya dilakukan melalui rujukan. Rujukan ini kekal hidup selagi lambda wujud, yang kadangkala boleh membawa kepada tingkah laku yang tidak diingini jika pembolehubah yang ditangkap dialih keluar.

Penyelesaian A C 14: Tangkapan Lambda Umum

Dalam C 14, umum tangkapan lambda telah diperkenalkan, membolehkan tangkapan bergerak. Ini membolehkan manipulasi mudah bagi jenis bergerak sahaja, seperti penunjuk unik.

std::make_unique<int>()
    .then([u = std::move(u)] { do_something_with(u); });
Salin selepas log masuk

Penyelesaian untuk C 11

Sebelum C 14, tangkapan gerak boleh dicontohi menggunakan fungsi pembantu:

Kaedah 1: make_rref

Pendekatan ini mencipta kelas pembalut, rref_impl, yang merangkum nilai dan mengurus sepanjang hayatnya.

template <typename T> using rref_impl = ...;
auto rref = make_rref(std::move(val));

[rref]() mutable { std::move(rref.get()); };
Salin selepas log masuk

Walau bagaimanapun, menangkap rref dalam lambda membolehkannya disalin, yang berpotensi membawa kepada ralat masa jalan.

Kaedah 2 : capture() Function

Kaedah ini menggunakan fungsi yang mengambil nilai yang ditangkap sebagai rujukan dan mengembalikan lambda yang memanggil fungsi dengan nilai yang ditangkap sebagai argumen.

template <typename T, typename F> using capture_impl = ...;
auto lambda = capture(std::move(val), [](auto&& v) { return std::forward<decltype(v)>(v); });
Salin selepas log masuk

Ini menghalang penyalinan lambda dan memastikan bahawa nilai yang ditangkap dialihkan ke dalam skop lambda.

Ingat , penyelesaian ini tidak begitu elegan seperti tangkapan lambda umum dalam C 14, tetapi ia menyediakan cara untuk meniru tangkapan bergerak dalam versi bahasa terdahulu.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mencapai Move Capture dalam C Lambdas, Terutamanya dalam C 11?. 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