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

Mengapa Menentukan Parameter Templat Secara Eksplisit dalam `std::make_pair` C 11 Gagal Disusun?

Mary-Kate Olsen
Lepaskan: 2025-01-01 12:49:11
asal
996 orang telah melayarinya

Why Does Explicitly Specifying Template Parameters in C  11's `std::make_pair` Fail to Compile?

C 11 make_pair dengan Parameter Templat Ditentukan Gagal Disusun

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);
Salin selepas log masuk

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);
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan