S:
Semasa menggunakan C 11 dengan g 4.7, percubaan untuk menyusun kod menggunakan fungsi std::make_pair dengan templat yang dinyatakan secara eksplisit parameter gagal. Memahami punca ralat ini ialah objektifnya.
J:
Penggunaan yang salah untuk make_pair
std::make_pair bertujuan untuk potongan hujah templat automatik. Menentukan parameter templat secara eksplisit menghalang potongan ini, yang membawa kepada ketidakpadanan antara jenis hujah sebenar dan yang dijangkakan. Fungsi ini mengambil hujah jenis T&& dan U&&, dengan T dan U ialah parameter jenis templat, dengan berkesan menyerupai:
template<typename T, typename U> make_pair(T&& argT, U&& argU);
Percanggahan Jenis Argumen
Apabila menentukan parameter templat secara eksplisit, tiada potongan hujah berlaku. Sebaliknya, jenis yang ditentukan digunakan secara langsung dalam templat fungsi, menghasilkan:
make_pair(std::string&& argT, int&& argU);
Dalam kes ini, kedua-dua jenis parameter ialah rujukan rnilai, yang hanya boleh mengikat kepada rnilai. Walau bagaimanapun, salah satu hujah, s, ialah lvalue (objek sedia ada), menjadikannya tidak serasi dengan jenis rujukan rvalue yang dijangkakan. Oleh itu, templat fungsi tidak boleh sepadan dengan hujah yang dibekalkan, membawa kepada ralat penyusunan.
Penggunaan Betul untuk make_pair
Untuk menyelesaikan isu ini, alih keluar spesifikasi parameter templat eksplisit dan membenarkan potongan hujah automatik. Dalam senario ini, pengkompil boleh menyimpulkan T sebagai std::string, kerana s ialah lnilai jenis std::string, menghasilkan std::string& sebagai jenis hujah terakhir. Begitu juga, U disimpulkan sebagai int, dengan hujah 7 ialah rnilai jenis int, menghasilkan int&&. Jenis argumen ini sepadan dengan betul dengan templat fungsi, membenarkan penyusunan yang berjaya.
Garis Panduan Am untuk Templat
Untuk templat, biasanya dinasihatkan untuk membenarkan pengkompil melakukan pemotongan hujah templat bila-bila boleh. Menentukan parameter templat secara eksplisit hanya boleh dilakukan apabila benar-benar perlu.
Atas ialah kandungan terperinci Mengapa Menentukan Parameter Templat Secara Eksplisit dalam `std::make_pair` C 11 Gagal Disusun?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!