Autant que je sache, le qualificatif const
en C++ déclare fondamentalement une liaison interne et permet parfois à la variable d'être utilisée comme une expression constante de sorte qu'elle puisse être placée dans les limites de la matrice, les étuis de commutation, etc.
Mais apparemment, ce n'est pas toujours le cas, et je n'ai aucune idée de la bonne utilisation de const
et constexpr
.
Spécifiquement, j'ai constaté que lorsqu'un élément d'une matrice qualifiée de const est utilisé dans les limites de la graisse, elle n'est pas traitée comme une expression constante, comme indiqué dans le code suivant.
const int N = 3;
int foo[N] = {1, 2, 3}; // Valid
const int bar[5] = {1, 2, 3, 4, 5};
int arr[bar[2]] = {1, 2, 3}; // Invalid because a VLA can't be initialized
Utiliser constexpr
au lieu de const
dans la partie ultérieure résout le problème. Mais pourquoi la dernière déclaration est-elle invalide? Et exactement ce qui est requis pour qu'une expression soit constante?
Il est parfaitement aligné sur les normes
Utiliser Constexpr au lieu de Cons dans la partie ultérieure résout le problème.
Parce que consexpr évalue la valeur au moment de la compilation
Mais pourquoi la dernière déclaration est-elle invalide?
const int bar[5] = {1, 2, 3, 4, 5};
dit que les valeurs de la barre sont des valeurs constantes évaluées au moment de l'exécution
int arr[bar[2]] = {1, 2, 3};
ici, vous faites ce chèque à l'heure de la compilation. Donc, const est une erreur. L'utilisation de Consexport résout la résolution de la compilation.
Et exactement ce qui est requis pour qu'une expression soit constante?
déclarer Const à une expression indique au compilateur de traiter cette valeur en tant que const et de ne pas permettre au programmeur de le modifier. Const et Constexpr sert à la fois le but, mais la déclaration rend le compilateur à différer l'initialisation jusqu'au moment de l'exécution. Comme le compilateur vérifie la valeur constante dans INTRA ARR [BAR [2]] Au moment de la compilation, il lance une erreur.