Il me semble que le fait d'avoir une "fonction qui renvoie toujours 5" rompt ou dilue le sens de l'expression "appeler une fonction". Il doit y avoir une raison, ou un besoin pour cette capacité, sinon elle ne serait pas dans C++11. Pourquoi est-elle là ?
// preprocessor.
#define MEANING_OF_LIFE 42
// constants:
const int MeaningOfLife = 42;
// constexpr-function:
constexpr int MeaningOfLife () { return 42; }
Il me semble que si j'écrivais une fonction qui renvoie une valeur littérale, et que je me présentais à une revue de code, quelqu'un me dirait que je devrais alors déclarer une valeur constante au lieu d'écrire return 5.
29 votes
Pouvez-vous définir une fonction récursive qui renvoie un
constexpr
? Si oui, je peux en voir l'utilité.31 votes
Je pense que la question devrait être "pourquoi introduire un nouveau mot-clé ( !) si le compilateur peut déduire par lui-même si une fonction peut être évaluée au moment de la compilation ou non". L'avoir "garanti par un mot-clé" semble bien, mais je pense que je préférerais l'avoir garanti chaque fois que c'est possible, sans avoir besoin d'un mot-clé.
7 votes
@Kos : Quelqu'un qui est PLUS familier avec les internes de C++ préférerait probablement votre question, mais ma question vient du point de vue d'une personne qui a écrit du code C auparavant, mais qui n'est pas du tout familier avec les mots-clés de C++ 2011, ni avec les détails de l'implémentation du compilateur C++. Être capable de raisonner sur l'optimisation du compilateur et la déduction des expressions constantes est un sujet pour une question d'utilisateur plus avancé que celle-ci.
15 votes
@Kos Je pensais à la même chose que toi, et la réponse à laquelle j'ai abouti était la suivante : sans constexpr, comment pourrais-tu (facilement) connaître que le compilateur a réellement évalué la fonction pour vous ? Je suppose que vous pourriez vérifier la sortie de l'assemblage pour voir ce qu'il a fait, mais il est plus facile de dire au compilateur que vous avez besoin de cette optimisation, et si pour une raison quelconque il ne peut pas le faire pour vous, il vous donnera une belle erreur de compilation au lieu d'échouer silencieusement à optimiser là où vous l'attendiez.
5 votes
@Kos : On pourrait dire la même chose de
const
. En effet, intention délibérée est utile ! Les dimensions d'un tableau sont l'exemple canonique.0 votes
Peut-être que cet article de
boost/hana
bibliothèque peut mettre en lumière certainsconstexpr
où vous pouvez utiliserconstexpr
et où vous ne pouvez pas : boost.org/doc/libs/1_69_0/libs/hana/doc/html/0 votes
@JeremyFriesner Je pense que votre commentaire est un peu trompeur. Par exemple, si vous utilisez la fonction constexpr avec une variable d'exécution, elle n'échouera pas et agira silencieusement comme une fonction en ligne. Elle n'échouera que si le symbole constexpr ne peut jamais être évalué au moment de la compilation (par exemple, lorsque vous utilisez la fonction
new
).