jak można przekazać l-wartości do std :: make_pair

Aug 16 2020

W std::make_pair tym jest tylko jedna implementacja C ++ 14 i nowsze

szablon <klasa T1, klasa T2> constexpr std :: pair <V1, V2> make_pair (T1 && t, T2 && u);

Oba parametry są odniesieniami do wartości R i zgodnie z tym

Odwołań do wartości R nie można zainicjować wartościami l.

    int i = 1;
    char ch = 'a';
    std::unordered_map<int, char> mp;
    mp.insert(make_pair<int,char>(i, ch));

Więc kiedy próbuję użyć make_pair jak w powyższym kodzie, poprawnie generuje błąd error: cannot bind rvalue reference of type 'int&&' to lvalue of type 'int'.

Jednak działa to idealnie dla powyższego kodu, jeśli zmienię, porzucę argumenty szablonu i nazwie go jako

mp.insert(make_pair(i, ch));

Jestem zdezorientowany, jak to działa ii chobie są wartościami L. Czy rozdzielczość argumentów szablonu konwertuje wartości L na wartości R lub jak to działa?

Odpowiedzi

3 songyuanyao Aug 16 2020 at 08:06

Parametry make_pairnie są zadeklarowane jako r-wartość-referencja, ale przekazująca referencję .

Referencje przekazujące to specjalny rodzaj referencji, które zachowują kategorię wartości argumentu funkcji, umożliwiając przekazanie go dalej za pomocą std :: forward. Odwołania do przekazywania to:

  1. parametr funkcji szablonu funkcji zadeklarowany jako odwołanie do wartości r do parametru szablonu typu cv-unqualified tego samego szablonu funkcji:

Odniesienie do przekazywania działa zarówno z lvalues, jak i rvalues, przy pomocy szablonowej dedukcji argumentów . Gdy zostanie przekazana lwartość, parametr szablonu zostanie wydedukowany jako l-wartość-referencja, po zwinięciu referencji parametr funkcji również będzie l-wartość-referencja. Podczas przekazywania wartości r, parametr szablonu zostałby wydedukowany jako brak odniesienia, parametr funkcji to rvalue-reference.

Z drugiej strony, jeśli określisz argument szablonu w sposób jawny make_pair<int,char>(...), parametr funkcji stanie się odpowiednio odwołaniem do wartości r.

1 JaMiT Aug 16 2020 at 11:01

Odpowiedź przez songyuanyao wyjaśnia już większość tego, co się dzieje. Chciałbym jednak przyczynić się do tego, jak sprawić, by to działało z jawnymi argumentami szablonu. Byłeś tam przez większość drogi, ale nie zrobiłeś ostatniego kroku.

Jestem zdezorientowany, jak to działa ii chobie są wartościami L.

Dokładnie. Chcesz l-wartości, które możesz określić w argumentach szablonu:

std::make_pair<int &, char &>(i, ch)

lub formularz, który działa w większej liczbie przypadków:

std::make_pair<const int &, const char &>(i, ch)

Trochę dodatkowego pisania, ale potrzebne, jeśli dedukcja argumentów nie powiedzie się z jakiegoś powodu.