Rumah >pembangunan bahagian belakang >C++ >Mengapakah `std::thread` Tidak Memintas Menyalin Pembina Apabila Menghantar Hujah melalui Rujukan?

Mengapakah `std::thread` Tidak Memintas Menyalin Pembina Apabila Menghantar Hujah melalui Rujukan?

DDD
DDDasal
2024-11-27 12:04:09953semak imbas

Why Does `std::thread` Not Bypass Copy Constructors When Passing Arguments by Reference?

std::thread and Copy Constructors: Understanding the Pass-by-Reference Conundrum

std::thread, bahagian penting dalam moden Keupayaan multithreading C, memberikan dilema apabila menghantar objek dengan rujukan. Ini disebabkan oleh perbezaan asas antara cara bahasa mengendalikan rujukan dan cara std::thread memproses hujahnya.

Apabila menghantar objek melalui rujukan, kami menjangkakan pembina salinan akan dipintas kerana rujukan bertindak sebagai alias kepada objek asal. Walau bagaimanapun, andaian ini tidak berlaku untuk std::thread. Inilah sebabnya.

std::thread's Argument Handling

Bertentangan dengan jangkaan kami, std::thread memberikan hujahnya mengikut nilai. Objek fungsi diisytiharkan, menerima parameter yang sama seperti benang, dan kemudian dipanggil dengan argumen yang disediakan. Ini bermakna setiap hujah disalin ke dalam objek fungsi, walaupun ia diluluskan sebagai rujukan.

Pembina Salinan Peribadi dan Penyusunan Gagal

Dalam kod yang disediakan, Kelas log sengaja melumpuhkan pembina salinan dengan menjadikannya peribadi. Apabila std::thread cuba menyalin logger ke dalam objek fungsi, ia mencetuskan ralat kompilasi kerana pembina salinan peribadi tidak boleh diakses.

Menyelesaikan Isu dengan std::reference_wrapper

Untuk mendapatkan semula semantik rujukan apabila menghantar argumen kepada std::thread, kami boleh menggunakan std::reference_wrapper. Membungkus rujukan dengan std::reference_wrapper memastikan bahawa objek fungsi menerima rujukan kepada objek asal, mengelakkan perangkap penyalinan nilai.

Kod Menggunakan std::reference_wrapper

std::thread newThread(session, &sock, std::ref(logger));

Dalam contoh yang diperbetulkan ini, pengkompil dapat mencipta dengan betul std::benang objek kerana pembalak kini dibalut dengan std::reference_wrapper, mengekalkan status rujukannya.

Atas ialah kandungan terperinci Mengapakah `std::thread` Tidak Memintas Menyalin Pembina Apabila Menghantar Hujah melalui Rujukan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
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