§20.2.4 [declval]
template <class T>
typename add_rvalue_reference<T>::type declval() noexcept; // as unevaluated operand
Зачем использовать add_rvalue_reference
здесь?
От §20.9.7.2 [meta.trans.ref]
от add_rvalue_reference
:
Если
T
называет объект или тип функции, то член typedeftype
должен называтьT&&
; в противном случаеtype
называетT
. [Примечание. Это правило отражает семантику ссылочного коллапса (8.3.2). Например, когда типT
называет типT1&
, типadd_rvalue_reference<T>::type
не является ссылкой rvalue. -end note]
Так как add_rvalue_reference
предназначен для отражения ссылки в любом случае, почему бы просто не использовать T&&
, как показано ниже?
template<class T>
T&& declval();
Что может пойти не так? Каковы различия между этими двумя версиями?