Rumah >pembangunan bahagian belakang >C++ >Mengapa Menentukan Parameter Templat Secara Eksplisit dalam `std::make_pair` Menyebabkan Ralat Penyusunan dalam C 11?

Mengapa Menentukan Parameter Templat Secara Eksplisit dalam `std::make_pair` Menyebabkan Ralat Penyusunan dalam C 11?

Susan Sarandon
Susan Sarandonasal
2024-12-13 01:54:16982semak imbas

Why Does Explicitly Specifying Template Parameters in `std::make_pair` Cause Compilation Errors in C  11?

Ketidakupayaan std::make_pair untuk Menyusun Apabila Menentukan Secara Eksplisit Parameter Templat dalam C 11

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.

Punca Punca Ralat Penyusunan

Percubaan untuk menggunakan std::make_pair dengan argumen templat yang disediakan secara eksplisit (cth., std ::make_pair()) membawa kepada ketidakpadanan antara rujukan rvalue yang dijangkakan dan argumen lvalue sebenar (std::string).

Peranan Rujukan Rvalue dalam Templat

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.

Gelagat Pengkompil dengan Parameter Templat Ditinggalkan

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).

Penyelesaian dan Amalan Terbaik

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!

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