Qual é a diferença entre constexpr e const em C++?
Olá a todos! Comecei a estudar C++11 e me deparei com a nova palavra-chave `constexpr`. Antes, eu sempre usava `const` para declarar variáveis imutáveis. Mas agora apareceu também `constexpr`, e não consigo entender completamente quando usar cada um.
Por exemplo, escrevo este código:
```cpp
const int size = 5;
int arr[size]; // Isso funciona
```
Mas se eu escrever:
```cpp
int get_size() { return 5; }
const int size = get_size();
int arr[size]; // Erro de compilação em padrões antigos!
```
Entendo que `const` apenas proíbe a modificação da variável após a inicialização, mas não garante que o valor seja conhecido em tempo de compilação. Ao mesmo tempo, vejo exemplos com `constexpr`:
```cpp
constexpr int square(int x) { return x * x; }
constexpr int val = square(5); // Ok, calculado em compile-time
```
Perguntas:
1. Qual é a diferença fundamental entre `const` e `constexpr` para variáveis?
2. Quando devo usar `constexpr` para funções?
3. O `constexpr` pode substituir o `const`?