jak można przekazać l-wartości do std :: make_pair
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 i
i ch
obie są wartościami L. Czy rozdzielczość argumentów szablonu konwertuje wartości L na wartości R lub jak to działa?
Odpowiedzi
Parametry make_pair
nie 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:
- 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.
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
i
ich
obie 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.