Dalam percubaan untuk menghantar rujukan bukan const sebagai hujah kepada std::async, pembangun mungkin menghadapi ralat kompilasi seperti yang disebutkan dalam pertanyaan asal. Artikel ini menyelidiki alasan di sebalik kegagalan ini dan pilihan reka bentuk asas yang terlibat.
std::async ialah alat yang berkuasa untuk melaksanakan tugas secara tidak segerak, tetapi tingkah lakunya boleh mengelirukan apabila meluluskan hujah rujukan. Pertimbangkan contoh berikut:
<code class="cpp">void foo(int& value) {} int main() { int value = 23; std::async(foo, value); // Error: no type named 'type' in 'class std::result_of<void (*(int))(int&>)>' }</code>
Kod ini gagal disusun dengan reference_wrapper yang tidak jelas. Mengapa ini berlaku?
Sebab bagi tingkah laku ini terletak pada pilihan reka bentuk yang disengajakan. std::async sengaja membuat salinan semua hujah secara lalai untuk memastikan keselamatan. Pendekatan ini menghalang potensi isu yang berkaitan dengan rujukan berjuntai dan keadaan kaum.
Walau bagaimanapun, dalam senario tertentu, mengemukakan hujah melalui rujukan adalah perlu. Untuk memenuhi keperluan ini, fungsi std::ref wujud sebagai mekanisme ikut serta eksplisit untuk semantik rujukan. Dengan membungkus hujah dalam std::ref, pembangun boleh secara jelas menunjukkan bahawa mereka memahami potensi risiko dan bertanggungjawab untuk mengendalikannya.
Pilihan reka bentuk untuk disalin secara lalai dan gagal untuk menghantar kepada rujukan bukan nilai tetap adalah berakar umbi dalam pertimbangan keselamatan. std::async tidak dapat menentukan dengan pasti sama ada fungsi yang dipanggil mengambil hujahnya melalui rujukan atau tidak, dan ia mengutamakan keselamatan berbanding kemudahan.
Memahami pilihan reka bentuk di sebalik kelakuan std::async adalah penting untuk menggunakannya dengan berkesan. Secara lalai, menghantar hujah rujukan tidak dibenarkan untuk mengelakkan isu yang berpotensi. Walau bagaimanapun, apabila semantik rujukan benar-benar diperlukan, std::ref menyediakan cara terkawal untuk mengatasinya sambil mengakui potensi risiko.
Atas ialah kandungan terperinci Mengapa Meluluskan Rujukan Bukan Const kepada `std::async` Mengakibatkan Ralat Penyusunan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!