Introdução
constexpr
não foi introduzido como uma maneira de dizer à implementação que algo pode ser avaliado em um contexto que requer uma expressão constante ; implementações em conformidade conseguiu provar isso antes do C ++ 11.
Algo que uma implementação não pode provar é a intenção de um determinado pedaço de código:
- O que é que o desenvolvedor deseja expressar com essa entidade?
- Devemos permitir cegamente que o código seja usado em uma expressão constante , apenas porque funciona?
O que seria do mundo sem constexpr
?
Digamos que você esteja desenvolvendo uma biblioteca e compreenda que deseja calcular a soma de cada número inteiro no intervalo (0,N]
.
int f (int n) {
return n > 0 ? n + f (n-1) : n;
}
A falta de intenção
Um compilador pode facilmente provar que a função acima pode ser chamada em uma expressão constante se o argumento passado for conhecido durante a tradução; mas você não declarou isso como uma intenção - aconteceu de acontecer.
Agora alguém aparece, lê sua função, faz a mesma análise que o compilador; " Oh, esta função é utilizável em uma expressão constante!" e escreve o seguinte trecho de código.
T arr[f(10)]; // freakin' magic
A otimização
Você, como um desenvolvedor de biblioteca "impressionante" , decide que f
deve armazenar em cache o resultado ao ser chamado; quem gostaria de calcular o mesmo conjunto de valores repetidamente?
int func (int n) {
static std::map<int, int> _cached;
if (_cached.find (n) == _cached.end ())
_cached[n] = n > 0 ? n + func (n-1) : n;
return _cached[n];
}
O resultado
Ao introduzir sua otimização boba, você acabou de quebrar todos os usos de sua função que estavam em um contexto em que uma expressão constante era necessária.
Você nunca prometeu que a função era utilizável em uma expressão constante e , sem ela, constexpr
não haveria maneira de oferecer tal promessa.
Então, por que precisamos constexpr
?
O uso principal do constexpr é declarar intenção .
Se uma entidade não estiver marcada como constexpr
- ela nunca foi projetada para ser usada em uma expressão constante ; e, mesmo que seja, contamos com o compilador para diagnosticar esse contexto (porque desconsidera nossa intenção).
constexpr
? Nesse caso, posso ver um uso.