Operatory konwersji wydedukowanej wartości zwrotu są nieco dziwne. Ale podstawową ideą jest to, że działa jak parametr funkcji, aby wybrać, który z nich zostanie użyty.
I przy podejmowaniu decyzji pomiędzy T&&
i T&
gdy T&
wygrywa w zasadach rozwiązywania przeciążenie. Ma to na celu:
template<class T>
void f( T&& ) { std::cout << "rvalue"; }
template<class T>
void f( T& ) { std::cout << "lvalue"; }
pracować. T&&
może się równać z wartością, ale gdy dostępne są przeciążenia zarówno dla wartości, jak i dla wartości uniwersalnych, preferowana jest wartość dla tej wartości.
Właściwy zestaw operatorów konwersji to prawdopodobnie:
template <typename T>
operator T&&() &&;
template <typename T>
operator T &() const; // maybe &
lub nawet
template <typename T>
operator T() &&;
template <typename T>
operator T &() const; // maybe &
aby uniknąć gryzienia nieudanego przedłużenia życia.
3 Typy używane do określania kolejności zależą od kontekstu, w którym odbywa się częściowe uporządkowanie:
[FANTASTYCZNA OKAZJA]
(3.2) W kontekście wywołania funkcji konwersji stosowane są typy zwracanych szablonów funkcji konwersji.
Który następnie kończy się w zależności od „bardziej wyspecjalizowanych” reguł przy wybieraniu przeciążeń:
(9.1) jeżeli typ z szablonu argumentu był odwołaniem do wartości, a typ z szablonu parametru nie, typ parametru nie jest uważany za co najmniej tak wyspecjalizowany jak typ argumentu; Inaczej,
Zatem operator T&&
nie jest on przynajmniej tak wyspecjalizowany jak operator T&
, tymczasem żadne stany reguł operator T&
nie są tak wyspecjalizowane jak operator T&&
, więc operator T&
są bardziej wyspecjalizowane niż operator T&&
.
Bardziej wyspecjalizowane szablony wygrywają rozdzielczość przeciążenia mniejszą, a wszystko inne jest równe.