web-dev-qa-db-fra.com

Quand le qualificatif «const» garantit la variable d'être une expression constante?

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?

23
morimn

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.

0
User