Rumah > pembangunan bahagian belakang > C++ > Mengapakah `std::make_pair` Gagal dengan Parameter Templat Eksplisit dalam C 11?

Mengapakah `std::make_pair` Gagal dengan Parameter Templat Eksplisit dalam C 11?

DDD
Lepaskan: 2024-12-16 16:58:17
asal
880 orang telah melayarinya

Why Does `std::make_pair` Fail with Explicit Template Parameters in C  11?

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

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

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!

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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan