Bagaimanakah Saya Boleh Menangkap Penunjuk Unik dalam Ungkapan C Lambda dengan betul?

Patricia Arquette
Lepaskan: 2024-11-21 05:23:10
asal
562 orang telah melayarinya

How Can I Correctly Capture Unique Pointers in C   Lambda Expressions?

Merakam Penunjuk Unik dalam Ungkapan Lambda

Adalah perkara biasa untuk menghadapi kesukaran apabila cuba menangkap penunjuk unik dalam ungkapan lambda. Pertimbangkan senario berikut:

std::function<void()> getAction(std::unique_ptr<MyClass> &&psomething) {
    // Caller gives ownership of psomething
    return [psomething]() {
        psomething->do_some_thing();
        // psomething is expected to be released after this point
    };
}
Salin selepas log masuk

Kod di atas gagal disusun kerana ketidakupayaan lambda untuk menangkap penunjuk unik melalui rujukan. Untuk menyelesaikan isu ini, C 14 memperkenalkan tangkapan umum lambda.

Tangkapan Umum Lambda dalam C 14

Tangkapan umum Lambda membenarkan untuk menangkap pembolehubah mengikut nilai atau pergerakan. Ini dicapai dengan menggunakan sintaks = move() apabila menangkap penunjuk unik, seperti yang dilihat di bawah:

std::function<void()> getAction(std::unique_ptr<MyClass> psomething) {
    // Caller gives ownership of psomething
    return [auto psomething = std::move(psomething)]() {
        psomething->do_some_thing();
        // psomething is expected to be released after this point
    };
}
Salin selepas log masuk

Dengan menggunakan auto, lambda secara automatik menyimpulkan jenis psomething, yang merupakan penunjuk unik. Ungkapan = std::move(psomething) secara eksplisit memindahkan pemilikan penuding unik ke dalam ungkapan lambda.

Pelaksanaan Move and Copy

Pelaksanaan salinan dan pindahkan fungsi yang disediakan dalam soalan adalah sah untuk salinan/pindah dua fasa (seperti yang diterangkan dalam [StackOverflow ini soalan](https://stackoverflow.com/questions/6322951/whats-the-difference-between-a-copy-constructor-and-a-move-constructor)).

Walau bagaimanapun, ia adalah penting untuk ambil perhatian bahawa C 11 memperkenalkan makna yang berbeza untuk fungsi bergerak melalui ungkapan std::move. Ungkapan std::move rvalue-melayakkan objek yang digunakan, pada asasnya menunjukkan bahawa ia harus dialihkan. Oleh itu, dalam konteks tangkapan umum lambda, tidak perlu memanggil secara eksplisit std::move pada penunjuk unik; lambda akan mengalihkan pemilikan secara automatik mengikut keperluan.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menangkap Penunjuk Unik dalam Ungkapan C Lambda dengan betul?. 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