Namespaces
Variants

std::declval

Depuis fr.cppreference.net
 
 
Bibliothèque d'utilitaires
Support du langage
Support des types (types de base, RTTI)
Macros de test de fonctionnalités de la bibliothèque (C++20)
Utilitaires de programme
Fonctions variadiques
Support des coroutines (C++20)
Support des contrats (C++26)
Comparaison à trois voies
(C++20)
(C++20)(C++20)(C++20)    
(C++20)(C++20)(C++20)

Utilitaires généraux
Opérateurs relationnels (obsolète en C++20)
 
Défini dans l'en-tête <utility>
template< class T >
typename std::add_rvalue_reference<T>::type declval() noexcept;
(depuis C++11)
(jusqu'à C++14)
(uniquement non évalué)
template< class T >
std::add_rvalue_reference_t<T> declval() noexcept;
(depuis C++14)
(uniquement non évalué)

Gabarit auxiliaire pour écrire des expressions qui apparaissent dans des contextes non évalués, généralement l'opérande de decltype. Dans un contexte non évalué, ce gabarit auxiliaire convertit tout type T (qui peut être un type incomplet) en une expression de ce type, permettant d'utiliser les fonctions membres de T sans avoir besoin de passer par des constructeurs.

std::declval ne peut être utilisé que dans des contextes non évalués et n'a pas besoin d'être défini ; c'est une erreur d'évaluer une expression qui contient cette fonction. Formellement, le programme est mal formé si cette fonction est odr-utilisée.

Paramètres

(aucun)

Valeur de retour

Ne peut pas être évalué et ne renvoie donc jamais de valeur. Le type de retour est T&& (les règles de référence collapsing s'appliquent) sauf si T est (éventuellement qualifié cv) void , auquel cas le type de retour est T .

Notes

std::declval est couramment utilisé dans les templates où les paramètres de template acceptables peuvent n'avoir aucun constructeur en commun, mais possèdent la même fonction membre dont le type de retour est nécessaire.

Implémentation possible

template<typename T>
typename std::add_rvalue_reference<T>::type declval() noexcept
{
    static_assert(false, "declval non autorisé dans un contexte évalué");
}

Exemple

#include <iostream>
#include <utility>
struct Default
{
    int foo() const { return 1; }
};
struct NonDefault
{
    NonDefault() = delete;
    int foo() const { return 1; }
};
int main()
{
    decltype(Default().foo())               n1 = 1;     // type of n1 is int
    decltype(std::declval<Default>().foo()) n2 = 1;     // same
//  decltype(NonDefault().foo())               n3 = n1; // error: no default constructor
    decltype(std::declval<NonDefault>().foo()) n3 = n1; // type of n3 is int
    std::cout << "n1 = " << n1 << '\n'
              << "n2 = " << n2 << '\n'
              << "n3 = " << n3 << '\n';
}

Sortie :

n1 = 1
n2 = 1
n3 = 1

Voir aussi

decltype spécificateur (C++11) obtient le type d'une expression ou d'une entité
(C++11) (supprimé en C++20) (C++17)
déduit le type de résultat de l'invocation d'un objet appelable avec un ensemble d'arguments
(modèle de classe)