std::declval
is a compile-time utility used to construct an expression for the purpose of determining its type. It is defined like this:
template< class T >
typename std::add_rvalue_reference<T>::type declval() noexcept;
Would this not be simpler instead?
template< class T >
T declval() noexcept;
What is the advantage of a reference return type? And shouldn't it be called declref
?
The earliest historical example I find is n2958, which calls the function value()
but already always returns a reference.
Note, the operand of decltype
does not need to have an accessible destructor, i.e. it is not semantically checked as a full-expression.
template< typename t >
t declprval() noexcept;
class c { ~ c (); };
decltype ( declprval< c >() ) * p = nullptr; // OK
T
need to be copyable forT
to be a valid return type?T &&
would avoid that. – Hebraize