Rumah > pembangunan bahagian belakang > C++ > Mengapakah `std::thread` Kelihatan Menghubungi Pembina Salinan Apabila Melalui Rujukan?

Mengapakah `std::thread` Kelihatan Menghubungi Pembina Salinan Apabila Melalui Rujukan?

Barbara Streisand
Lepaskan: 2024-11-15 10:08:02
asal
1059 orang telah melayarinya

Why Does `std::thread` Appear to Call the Copy Constructor When Passing by Reference?

std::thread Melepasi Nilai: Salin Pembina Dipanggil

Masalah:
Apabila menyampaikan hujah kepada benang menggunakan std::thread, melalui rujukan nampaknya memanggil pembina salinan. Ini diperhatikan dalam kes di mana kelas yang diluluskan mempunyai pembina salinan yang dilumpuhkan.

Penjelasan:
Secara lalai, std::thread mengambil argumennya mengikut nilai. Walaupun kemunculan rujukan dalam tandatangan fungsi, hujah sebenarnya disalin ke dalam objek benang. Dalam contoh yang diberikan, kelas Log mempunyai pembina salinannya dilumpuhkan, oleh itu ralat pengkompil apabila menghantarnya melalui rujukan.

Penyelesaian: Semantik Rujukan dengan std::reference_wrapper:
Kepada mencapai semantik rujukan, gunakan std::reference_wrapper untuk membungkus objek dan menghantarnya ke benang. Ini secara berkesan menghantar rujukan kepada objek asal tanpa membuat salinan:

std::thread newThread(session, &sock, std::ref(logger));
Salin selepas log masuk

Pengisytiharan Fungsi Benang:
Untuk menggunakan std::ref, fungsi benang yang sepadan mesti diubah suai untuk menerima std::reference_wrapper:

static void session(tcp::socket *sock, std::reference_wrapper<Log> logger)
{
    std::cout << " session () " << std::endl;
}
Salin selepas log masuk

Pengurusan Sepanjang Hayat:
Adalah penting untuk memastikan objek yang dilalui (dalam kes ini, pembalak) hidup lebih lama daripada benang untuk mengelakkan berjuntai rujukan.

Atas ialah kandungan terperinci Mengapakah `std::thread` Kelihatan Menghubungi Pembina Salinan Apabila Melalui Rujukan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

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