§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();
Что может пойти не так? Каковы различия между этими двумя версиями?