Problème utilisation de constexpr

L'auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

Bonsoir à tous,
Mon problème est que mon code fonctionne alors que selon moi il ne devrait pas . D'après ce que je sais constexpr permet d'évaluer la valeur d'une variable ou d'une fonction au moment de la compilation alors et pourtant lorsque je l'évalue au moment de l’exécution ça fonctionne.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
constexpr int test(int a)
{
 return a;
}

int main()
{
  int a;
  cin>>a; 
  cout<<test(a)<<'\n'; //Pourquoi ça fonctionne ?
  return 0;
}

Je vous remercie d'avance de votre aide ,bonne soirée .

+0 -0

Cette réponse a aidé l'auteur du sujet

constexpr veut dire qu'on peut évaluer l'expression à la compilation, pas qu'on doit. Rien n'empeche d'utiliser une expression constexpr lors de l'éxecution (bien au contraire même).

Édité par Davidbrcz

+1 -0

Cette réponse a aidé l'auteur du sujet

Pour compléter Davidbrcz, constexpr indique pour une fonction que le compilateur peut évaluer le résultat à la compilation à condition que les paramètres soient connu à la compilation, ce qui n'est pas le cas dans ton code.

En revanche, pour une variable, constexpr indique qu'elle doit être évalué à la compilation. Donc si tu veux t'assurer que l'exécution d'une fonction constexpr est faite à la compilation, il te suffit de stocker le résultat dans une variable constexpr.

Au passage, les exigences d'une fonction constexpr sont plus forte que le simple fait que le compilateur puisse évaluer le résultat à la compilation. En C++11, tu n'as droit d'utiliser en gros que return avec potentiellement de la récursion et des conditions ternaires. En C++14, tu es plus libre puisque tu as droit en gros à tout sauf des trucs genre exceptions, goto, asm inline, variables non initialisés et autres.

Si tu veux tous les détails et que tu es familier avec l'anglais, tu peux regarder sur cppreference : http://en.cppreference.com/w/cpp/language/constexpr

+2 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte