Por que o C ++ 11 constexpr é tão restritivo?
Como você provavelmente sabe, o C ++ 11 apresenta oconstexpr
palavra-chave.
@ C ++ 11 introduziu a palavra-chave constexpr, que permite ao usuário garantir que uma função ou construtor de objetos seja uma constante em tempo de compilação. [...] Isso permite ao compilador entender e verificar se [nome da função] é uma constante em tempo de compilação.
Minha pergunta é por que existem restrições tão estritas na forma das funções que podem ser declaradas. Entendo o desejo de garantir que a função seja pura, mas considere isso:
O uso do constexpr em uma função impõe algumas limitações sobre o que essa função pode fazer. Primeiro, a função deve ter um tipo de retorno não nulo. Segundo, o corpo da função não pode declarar variáveis ou definir novos tipos. Terceiro, o corpo pode conter apenas declarações, declarações nulas e uma única declaração de retorno. Deve haver valores de argumento que, após a substituição do argumento, a expressão na instrução return produza uma expressão constant
Isso significa que essa função pura é ilegal:
constexpr int maybeInCppC1Y(int a, int b)
{
if (a>0)
return a+b;
else
return a-b;
//can be written as return (a>0) ? (a+b):(a-b); but that isnt the point
}
Além disso, você não pode definir variáveis locais ... :( Então, eu estou pensando que isso é uma decisão de design ou os compiladores são péssimos quando se trata de provar que a função é pur