std::declval
est au moment de la compilation de l'utilitaire utilisé pour construire une expression dans le but de déterminer son type. Il est défini comme ceci:
template< class T >
typename std::add_rvalue_reference<T>::type declval() noexcept;
Ne serait-ce pas plus simple à la place?
template< class T >
T declval() noexcept;
Quel est l'avantage d'une référence de type de retour? Et ne devrait-elle pas être appelés declref
?
Les premiers exemple historique qui je trouve est n2958, qui appelle la fonction value()
mais déjà renvoie toujours une référence.
Remarque, l'opérande de decltype
n'a pas besoin d'avoir un accessible destructeur, c'est à dire qu'il n'est pas sémantiquement vérifié qu'une expression.
template< typename t >
t declprval() noexcept;
class c { ~ c (); };
decltype ( declprval< c >() ) * p = nullptr; // OK