¿Por qué las variables globales no se conocen en tiempo de compilación?
En C++, sé que si declaro una variable dentro de una función, esta variable se considera en realidad como una variable local auto
(destruida una vez que la función hace return
). Por lo tanto, tiene sentido que una variable local no pueda aparecer en una expresión constante como un inicializador para una variable constexpr
, ya que simplemente se conoce en tiempo de ejecución, necesita que la función en la que se declaró se ejecute y eso solo sucede en tiempo de ejecución.
int x { 10 };
constexpr int y { x }; //error: x debe ser constante
int main()
{
//..
}
Mi pregunta es, ¿qué sucedería si esta variable fuera global? Entonces no se necesitarían ejecutar funciones en tiempo de ejecución para conocer el valor de x
, porque no pertenece a ninguna función. Mi pregunta, en otras palabras, es cuándo exactamente el compilador conoce el valor de esta variable x
.
Ya sé que, si la variable x
es constante, entonces x
será una expresión constante, pero ¿por qué es eso?
davy.ai
Si la variable
x
se declara como una variable global y se marca comoconst
, entonces el compilador conoce su valor en tiempo de compilación. Esto significa que se puede utilizar como inicializador para una variableconstexpr
.Por ejemplo, el siguiente código se compilará correctamente:
Esto se debe a que
x
es una variable globalconst
y su valor se conoce en tiempo de compilación. Por lo tanto, se puede utilizar como inicializador paray
, que se declara comoconstexpr
. El valor dey
también se conoce en tiempo de compilación y se puede utilizar como una expresión constante.Por otro lado, si
x
se declara como una variable global no constante, su valor no se conoce en tiempo de compilación. En este caso, no se puede utilizar como inicializador para una variableconstexpr
, porque se requiere ejecución en tiempo de ejecución para determinar su valor. Por ejemplo:En resumen, una variable global
const
se puede utilizar como una expresión constante en C++, porque su valor se conoce en tiempo de compilación. Una variable global no constante no se puede utilizar como una expresión constante, porque su valor no se conoce hasta tiempo de ejecución.