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í.