bagaimana l-values diteruskan ke std :: make_pair
Hanya std::make_pair
ada satu implementasi C ++ 14 dan seterusnya
template <kelas T1, kelas T2> constexpr std :: pasangan <V1, V2> make_pair (T1 && t, T2 && u);
Kedua parameter tersebut adalah referensi nilai-R dan menurut ini
Referensi nilai-R tidak dapat diinisialisasi dengan nilai-l.
int i = 1;
char ch = 'a';
std::unordered_map<int, char> mp;
mp.insert(make_pair<int,char>(i, ch));
Jadi ketika saya mencoba menggunakan make_pair seperti pada kode di atas itu dengan benar membuat kesalahan error: cannot bind rvalue reference of type 'int&&' to lvalue of type 'int'
.
Namun itu berfungsi dengan sempurna untuk kode di atas jika saya mengubah jatuhkan argumen template dan menyebutnya sebagai
mp.insert(make_pair(i, ch));
Saya bingung bagaimana ini bekerja karena i
dan ch
keduanya adalah nilai-L. Apakah resolusi argumen template mengonversi nilai-L menjadi nilai-R atau seperti bagaimana cara kerjanya?
Jawaban
Parameter dari make_pair
tidak dideklarasikan sebagai rvalue-reference, tetapi forwarding reference .
Referensi penerusan adalah jenis referensi khusus yang mempertahankan kategori nilai dari argumen fungsi, sehingga memungkinkan untuk meneruskannya dengan menggunakan std :: forward. Referensi penerusan adalah:
- parameter fungsi dari template fungsi yang dideklarasikan sebagai rvalue referensi ke cv-unqualified type template parameter dari template fungsi yang sama:
Referensi penerusan bekerja dengan lvalues dan rvalues, dengan bantuan pengurangan argumen template . Ketika melewati nilai l, parameter template akan disimpulkan sebagai lvalue-reference, setelah referensi runtuh, parameter fungsinya juga lvalue-reference. Saat meneruskan nilai r, parameter template akan disimpulkan sebagai non-referensi, parameter fungsinya adalah rvalue-reference.
Di sisi lain, jika Anda menentukan argumen template secara eksplisit make_pair<int,char>(...)
, parameter fungsi menjadi rvalue-reference yang sesuai.
The jawaban dengan songyuanyao sudah menjelaskan sebagian besar dari apa yang sedang terjadi. Namun, saya ingin berkontribusi bagaimana membuat ini bekerja dengan argumen template eksplisit. Sebagian besar perjalanan Anda ke sana, tetapi tidak mengambil langkah terakhir.
Saya bingung bagaimana ini bekerja karena
i
danch
keduanya adalah nilai-L.
Persis. Anda menginginkan nilai-l, yang dapat Anda tentukan dalam argumen template:
std::make_pair<int &, char &>(i, ch)
atau formulir yang berfungsi di lebih banyak kasus:
std::make_pair<const int &, const char &>(i, ch)
Sedikit tulisan tambahan, tetapi diperlukan jika deduksi argumen gagal karena suatu alasan.