Die abgeleiteten Rückgabewertumwandlungsoperatoren sind etwas seltsam. Die Kernidee ist jedoch, dass es sich wie ein Funktionsparameter verhält, um auszuwählen, welcher verwendet wird.
Und bei der Entscheidung zwischen T&&
und T&
den T&
Gewinnen in den Überlastungsauflösungsregeln. Dies soll ermöglichen:
template<class T>
void f( T&& ) { std::cout << "rvalue"; }
template<class T>
void f( T& ) { std::cout << "lvalue"; }
arbeiten. T&&
kann mit einem l-Wert übereinstimmen, aber wenn sowohl der l-Wert als auch die universelle Referenzüberladung verfügbar sind, wird der l-Wert bevorzugt.
Der richtige Satz von Konvertierungsoperatoren ist wahrscheinlich:
template <typename T>
operator T&&() &&;
template <typename T>
operator T &() const; // maybe &
oder auch
template <typename T>
operator T() &&;
template <typename T>
operator T &() const; // maybe &
um zu verhindern, dass eine fehlgeschlagene Verlängerung der Lebensdauer Sie beißt.
3 Die zur Bestimmung der Reihenfolge verwendeten Typen hängen vom Kontext ab, in dem die Teilbestellung erfolgt:
[SNIP]
(3.2) Im Rahmen eines Aufrufs einer Konvertierungsfunktion werden die Rückgabetypen der Konvertierungsfunktionsvorlagen verwendet.
Was dann bei der Auswahl von Überladungen von "spezialisierteren" Regeln abhängt:
(9.1) Wenn der Typ aus der Argumentvorlage eine Wertreferenz war und der Typ aus der Parametervorlage nicht, wird der Parametertyp nicht als mindestens so spezialisiert wie der Argumenttyp angesehen. Andernfalls,
Somit operator T&&
ist es nicht mindestens so spezialisiert wie operator T&
, während kein Regelstaat operator T&
nicht mindestens so spezialisiert ist wie operator T&&
, also operator T&
ist es spezialisierter als operator T&&
.
Speziellere Vorlagen gewinnen Überlastungsauflösung über weniger, alles andere ist gleich.