¿Por qué C ++ 11 constexpr es tan restrictivo?

omo probablemente sepa, C ++ 11 presenta elconstexpr palabra clave.

C ++ 11 introdujo la palabra clave constexpr, que permite al usuario garantizar que una función o un constructor de objetos sea una constante en tiempo de compilación. [...] Esto permite que el compilador comprenda y verifique que [nombre de la función] es una constante de tiempo de compilación.

Mi pregunta es por qué hay restricciones tan estrictas en la forma de las funciones que se pueden declarar. Entiendo el deseo de garantizar que la función sea pura, pero considere esto:

El uso de constexpr en una función impone algunas limitaciones sobre lo que puede hacer esa función. Primero, la función debe tener un tipo de retorno no nulo. En segundo lugar, el cuerpo de la función no puede declarar variables o definir nuevos tipos. En tercer lugar, el cuerpo solo puede contener declaraciones, declaraciones nulas y una sola declaración de devolución. Deben existir valores de argumento tales que, después de la sustitución del argumento, la expresión en la declaración de retorno produzca una expresión constante.

Eso significa que esta función pura es 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
}

También no puede definir variables locales ... :( ¿Entonces me pregunto si es una decisión de diseño, o los compiladores apestan cuando se trata de probar que la función a es pura?

Respuestas a la pregunta(10)

Su respuesta a la pregunta