std::declval
— это утилита времени компиляции, используемая для создания выражения с целью определения его типа. Он определяется следующим образом:
template< class T >
typename std::add_rvalue_reference<T>::type declval() noexcept;
Не будет ли это проще?
template< class T >
T declval() noexcept;
В чем преимущество ссылочного возвращаемого типа? И разве это не должно называться declref
?
Самый ранний исторический пример, который я нашел, это n2958, который вызывает функцию value()
, но уже всегда возвращает ссылку.
Обратите внимание, что операнд decltype
не обязательно должен иметь доступный деструктор, т. е. он не проверяется семантически как полное выражение.
template< typename t >
t declprval() noexcept;
class c { ~ c (); };
decltype ( declprval< c >() ) * p = nullptr; // OK
T
не нужно копировать, чтобыT
был допустимым типом возвращаемого значения?T &&
избегал бы этого. - person user2357112 supports Monica   schedule 07.09.2014