Dalam C 11, std::make_pair mengambil dua argumen, merujuk kepada rvalues ( T&& dan U&&). Walau bagaimanapun, menyatakan secara eksplisit parameter templat semasa invokasinya menghalang pemotongan hujah, mengakibatkan penggantian rujukan rnilai dalam perisytiharan templat fungsi. Ketidakpadanan ini, apabila argumen lvalue tidak boleh terikat pada rujukan rvalue, menyebabkan ralat kompilasi.
Percubaan untuk menggunakan std::make_pair dengan argumen templat yang disediakan secara eksplisit (cth., std ::make_pair
Parameter rujukan Rvalue dalam templat mempunyai keupayaan unik untuk mengikat mana-mana contoh parameter jenis templat mereka, tidak kira sama ada ia nilai, nilai, atau pun layak.
Apabila hujah templat ditinggalkan semasa seruan std::make_pair, pemotongan hujah templat berlaku. Pengkompil menyimpulkan jenis templat daripada hujah yang disediakan, dalam kes ini, std::string dan int. Parameter rujukan nilai (T&& dan U&&) masing-masing disimpulkan kepada std::string& dan int&&. Argumen templat yang terhasil untuk T diruntuhkan, menghapuskan rujukan tambahan, membenarkan pengikatan pada argumen lvalue (std::string).
Untuk mengelakkan ralat sedemikian, elakkan daripada secara eksplisit menyatakan argumen templat untuk std::make_pair melainkan perlu. Benarkan pengkompil melakukan potongan hujah, yang biasanya membawa kepada tingkah laku yang diingini. Jika hasil yang tidak dijangka berlaku, ralat kompilasi yang jelas akan membantu menentukan isu tersebut.
Atas ialah kandungan terperinci Mengapa Menentukan Parameter Templat Secara Eksplisit dalam `std::make_pair` Menyebabkan Ralat Penyusunan dalam C 11?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!