¿Cuál es la diferencia entre constexpr y const en C++?
¡Hola a todos! Empecé a estudiar C++11 y me encontré con la nueva palabra clave `constexpr`. Antes siempre usaba `const` para declarar variables inmutables. Pero ahora también apareció `constexpr`, y no termino de entender cuándo aplicar cada uno.
Por ejemplo, escribo este código:
```cpp
const int size = 5;
int arr[size]; // Esto funciona
```
Pero si escribo:
```cpp
int get_size() { return 5; }
const int size = get_size();
int arr[size]; // ¡Error de compilación en estándares antiguos!
```
Entiendo que `const` simplemente prohíbe modificar la variable después de la inicialización, pero no garantiza que el valor sea conocido en tiempo de compilación. Al mismo tiempo, veo ejemplos con `constexpr`:
```cpp
constexpr int square(int x) { return x * x; }
constexpr int val = square(5); // Ok, se calcula en compile-time
```
Preguntas:
1. ¿Cuál es la diferencia fundamental entre `const` y `constexpr` para variables?
2. ¿Cuándo se debe usar `constexpr` para funciones?
3. ¿Puede `constexpr` reemplazar a `const`?