En C++, il y a la constance à l'heure de la compilation et à l'heure de la liaison.
const est un objet qui ne peut pas être modifié après son initialisation. Mais const ne garantit pas toujours que la valeur est connue à l'heure de la compilation ; elle peut être calculée seulement à l'exécution.constexpr garantit que l'expression ou la fonction sera évaluée à l'heure de la compilation.Exemple :
const int x = time(0); // const, mais PAS constexpr : la valeur est calculée à l'exécution constexpr int y = 2 + 2; // constexpr : connus à l'heure de la compilation constexpr int square(int x) { return x * x; } int arr[square(3)]; // taille du tableau — expression à l'heure de la compilation
Utilisez constexpr pour les expressions constantes qui doivent être accessibles par le compilateur, par exemple, pour la taille des tableaux ou les paramètres de template.
Une fonction déclarée comme constexpr peut-elle être appelée avec des arguments non constants ?
Réponse : Oui ! Si les arguments sont connus à l'heure de la compilation, le résultat sera calculé à cette heure-là. Si les arguments ne sont connus qu'à l'exécution, la fonction sera calculée comme d'habitude.
constexpr int double_val(int x) { return x * 2; } int val = std::rand(); int result = double_val(val); // Appelé à l'heure d'exécution
Histoire
Un des modules définissait la taille d'un tableau via
const int, pensant que c'était une constante à l'heure de la compilation. Sur un autre compilateur, cela a causé une erreur, car la valeur était calculée à l'heure d'exécution, et la taille du tableau ne correspondait pas à la norme.
Histoire
Dans le calcul des hachages, le compilateur ne pouvait pas optimiser les calculs, car une variable
constétait utilisée au lieu deconstexpr. Résultat : diminution de performance de plus de 2 fois sur les nouvelles versions.
Histoire
Lors de la migration vers des normes modernes, des mots-clés ont été mélangés et une fonction a été déclarée comme
constplutôt queconstexpr, ce qui a empêché d'utiliser le résultat dans les expressions à l'heure de la compilation des templates. Un diagnostic rapide a montré l'erreur, mais lors de la révision, elle est allée dans le master.