const vs constexpr para variables en C++: cuál es la diferencia y qué elegir?
¡Hola a todos! Estoy aprendiendo C++11/14 y estoy confundido sobre la diferencia entre `const` y `constexpr` al declarar variables. Entiendo que ambas keywords hacen que una variable sea inmutable, pero en todas partes escriben que no son lo mismo.
Aquí hay un ejemplo que me confunde:
```cpp
const int x = 42; // Opción 1
constexpr int y = 42; // Opción 2
const int z = foo(); // Funciona
constexpr int w = foo(); // Error de compilación si foo() no es constexpr
```
He leído que `constexpr` garantiza la evaluación en tiempo de compilación, mientras que `const` no. Pero entonces, ¿para qué sirve `const` si `constexpr` es más estricto? ¿Y por qué veo en proyectos reales un uso generalizado de `const` para variables que son claramente conocidas en tiempo de compilación?
Otra pregunta: si escribo `const int size = 10;` y luego declaro `int arr[size];` — ¿funcionará? ¿Y si `size` se calcula a través de una función? He oído sobre VLA (variable-length arrays) y que es una extensión no estándar en C++, pero no entiendo cómo se relaciona con `const`.