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