§20.2.4 [declval]
template <class T>
typename add_rvalue_reference<T>::type declval() noexcept; // as unevaluated operand
Warum verwenden add_rvalue_reference
hier?
De §20.9.7.2 [meta.trans.ref]
auf add_rvalue_reference
:
Si
T
einen Objekt- oder Funktionstyp nennt, dann ist das Mitglied typedeftype
soll heißenT&&
; sonst,type
soll heißenT
. [ Anmerkung: Diese Regel spiegelt die Semantik der Referenzkollabierung (8.3.2) wider. Zum Beispiel, wenn ein TypT
benennt einen TypT1&
der Typadd_rvalue_reference<T>::type
ist keine rvalue-Referenz. -Ende Anmerkung ]
Desde add_rvalue_reference
soll ohnehin das Kollabieren von Referenzen widerspiegeln, warum also nicht einfach die T&&
wie die folgenden?
template<class T>
T&& declval();
Was kann schon schiefgehen? Was genau sind die Unterschiede zwischen den beiden Versionen?