Constant initialization
Définit les valeurs initiales des variables static à une constante évaluée à la compilation.
Table des matières |
Explication
Initialisation constante est effectuée dans les cas suivants :
|
(jusqu'à C++11) |
|
(depuis C++11)
(jusqu'à C++17) |
|
(depuis C++17)
(jusqu'à C++20) |
|
(depuis C++20) |
Les effets de l'initialisation constante sont les mêmes que ceux de l'initialisation correspondante, sauf qu'il est garanti qu'elle est terminée avant toute autre initialisation d'un objet statique ou thread-local (since C++11) commence.
Notes
Le compilateur est autorisé à initialiser d'autres objets statiques et thread-locaux (depuis C++11) en utilisant l'initialisation constante, s'il peut garantir que la valeur serait la même que si l'ordre standard d'initialisation était suivi.
L'initialisation constante se produit généralement lorsque le programme se charge en mémoire, dans le cadre de l'initialisation de l'environnement d'exécution du programme.
Exemple
#include <iostream> #include <array> struct S { static const int c; }; const int d = 10 * S::c; // pas une expression constante : S::c n'a pas d'initialiseur // précédent, cette initialisation se produit après const const int S::c = 5; // initialisation constante, garantie de se produire en premier int main() { std::cout << "d = " << d << '\n'; std::array<int, S::c> a1; // OK : S::c est une expression constante // std::array<int, d> a2; // erreur : d n'est pas une expression constante }
Sortie :
d = 50
Rapports de défauts
Les rapports de défauts modifiant le comportement suivants ont été appliqués rétroactivement aux normes C++ précédemment publiées.
| DR | Appliqué à | Comportement tel que publié | Comportement corrigé |
|---|---|---|---|
| CWG 441 | C++98 | les références ne pouvaient pas être initialisées de manière constante | rendues initialisables de manière constante |
| CWG 1489 | C++11 |
il n'était pas clair si l'initialisation par valeur
d'un objet pouvait être une initialisation constante |
c'est possible |
| CWG 1747 | C++11 | la liaison d'une référence à une fonction ne pouvait pas être une initialisation constante | c'est possible |
| CWG 1834 | C++11 | la liaison d'une référence à une xvalue ne pouvait pas être une initialisation constante | c'est possible |