c++ compiler-errors compilation constants

C++ Constantes y agregados dentro de la función cuerpo vs. exterior



compiler-errors compilation (2)

Lo más probable es que la razón por la que el compilador lo permite dentro de la función se deba a una extensión del compilador: matrices de longitud variable. Permiten que los arrays declarados dentro de funciones tengan longitudes no constexpr. Pero solo funciona dentro de las funciones, no a nivel global.

Considere la siguiente pieza de código:

#include <iostream> using namespace std; int main() { int x = 3; const int i[] = { 1, 2, 3, 4 }; float f[i[3]]; struct S { int i, j; }; const S s[] = { { 1, 2 }, { 3, 4 } }; double d[s[1].j]; }

Se ejecuta sin error. Sin embargo, lo siguiente:

#include <iostream> using namespace std; int x = 3; const int i[] = { 1, 2, 3, 4 }; float f[i[3]]; // error: array bound is not an integer constant before '']'' token| struct S { int i, j; }; const S s[] = { { 1, 2 }, { 3, 4 } }; double d[s[1].j]; // error: array bound is not an integer constant before '']'' token| int main() { return 0; }

No lo hace, ya que recibe los errores que se destacan como comentarios. ¿Alguien puede explicarme por qué es eso?


Tienes que usar constexpr lugar de const

constexpr int i[] = { 1, 2, 3, 4 }; constexpr S s[] = { { 1, 2 }, { 3, 4 } };

const aplica a las variables y evita que se modifiquen en su código.

constexpr le dice al compilador que esta expresión da como resultado un valor de constante de tiempo de compilación , por lo que se puede usar en lugares como longitudes de matriz , asignación a variables const, etc.

Por lo que compila en funcion es VLA. No es posible declarar VLA en alcance global.

6.7.6.2 Declaradores de matrices

2 Si se declara que un identificador tiene un tipo modificado de forma variable, debe ser un identificador ordinario (como se define en 6.2.3), no tiene enlace, y tiene un alcance de bloque o un alcance de prototipo de función. Si se declara que un identificador es un objeto con una duración de almacenamiento de subprocesos o estática, no tendrá un tipo de matriz de longitud variable.

Además, los VLA no son parte del estándar de c ++ , su única extensión de compilador aquí.