bagaimana l-values ​​diteruskan ke std :: make_pair

Aug 16 2020

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 idan chkeduanya adalah nilai-L. Apakah resolusi argumen template mengonversi nilai-L menjadi nilai-R atau seperti bagaimana cara kerjanya?

Jawaban

3 songyuanyao Aug 16 2020 at 08:06

Parameter dari make_pairtidak 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:

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

1 JaMiT Aug 16 2020 at 11:01

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 idan chkeduanya 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.