C 11 make_pair Gagal dengan Parameter Templat Eksplisit
Masalah:
Apabila menggunakan g 4.7 dengan -std=c 11 didayakan, kod berikut gagal compile:
std::pair<std::string, int>& b = std::make_pair<std::string, int>(s, 7);
Walaupun wujudnya fungsi make_pair, compiler ralat keluar.
Penjelasan:
std::make_pair dimaksudkan untuk digunakan tanpa menyatakan secara eksplisit parameter templat. Dalam C 11, ia memerlukan dua argumen rujukan nilai, T&& dan U&&, dengan T dan U ialah parameter jenis templat. Walau bagaimanapun, penetapan argumen templat secara eksplisit membawa kepada ketidakpadanan antara rujukan rvalue yang dijangkakan dan argumen lvalue yang disediakan (s dalam kod contoh).
Oleh itu, pengkompil melaporkan:
error: no matching function for call to ‘make_pair(std::string&, int)’
Apabila hujah templat tidak diberikan secara eksplisit, potongan hujah templat berlaku. Ini membenarkan parameter templat rujukan rvalue untuk mengikat kepada lvalue apabila ia muncul sebagai hujah fungsi. Dalam kes std::make_pair tanpa hujah templat, pengkompil menyimpulkan T sebagai std::string& dan U sebagai int dan berjaya mengikat s dan 7 kepada argumen fungsi.
Penyelesaian:
Penggunaan std::make_pair yang disyorkan adalah untuk meninggalkan hujah templat, bergantung pada potongan hujah templat. Dengan mengikut peraturan ini, pengkompil akan mengendalikan padanan hujah dengan betul dan mengelakkan ralat penyusunan.
Atas ialah kandungan terperinci Mengapakah `std::make_pair` Gagal dengan Parameter Templat Eksplisit dalam C 11?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!