Whyever ** not ** declara que una función es `constexpr`?

Cualquier función que consista en una declaración de retorno solo podría declararseconstexpr y, por lo tanto, permitirá ser evaluado en tiempo de compilación si todos los argumentos sonconstexpr y soloconstexpras funciones @ se llaman en su cuerpo. @ ¿Hay alguna razón para no declararningun tal funciónconstexpr ?

Ejemplo

  constexpr int sum(int x, int y) { return x + y; }
  constexpr i = 10;
  static_assert(sum(i, 13) == 23, "sum correct");

Podría alguien proporcionar un ejemplo donde declarar una funciónconstexpr haría algún daño?

Algunos pensamientos iniciales:

Incluso si no hubiera una buena razón para declarar una función que no seaconstexpr Me imagino que elconstexpra palabra clave @ tiene un papel de transición: su ausencia en el código que no necesita evaluaciones en tiempo de compilación permitiría que los compiladores que no implementan evaluaciones en tiempo de compilación sigan compilando ese código (pero fallar de manera confiable en el código que los necesita como explícito al usar @constexpr).

Pero lo que no entiendo: si no hubiera una buena razón para declarar una función que no seaconstexpr, Por qué no escadunción @ en la biblioteca estándar declaradaconstexpr? (No puede argumentar que aún no se ha hecho porque aún no había tiempo suficiente para hacerlo, porque hacerlo paratodo es obvio - al contrario de decidir para cada función si hacerlaconstexpr o no.) --- Soy consciente de que N2976 deliberadamente no requiere cstrs para muchos tipos de bibliotecas estándar, como los contenedores, ya que esto sería demasiado limitante para posibles implementaciones. Vamos a excluirlos del argumento y simplemente preguntarnos: una vez que un tipo en la biblioteca estándar realmente tiene unconstexpr cstr, ¿por qué no todas las funciones que operan en él se declaranconstexpr?

En la mayoría de los casos, tampoco puede argumentar que puede preferir no declarar una funciónconstexpr simplemente porque no prevé ningún uso en tiempo de compilación: porque si otros evtl. usará su código, pueden ver un uso tal que usted no. (Pero, por supuesto, para los tipos de rasgos y cosas similares, por supuesto).

Así que supongo que debe haber una buena razón y un buen ejemplo para no declarar deliberadamente una funciónconstexpr?

(con "cada función" quiero decir siempre: cada función que cumple los requisitos para serconstexpr, es decir, se define como una única declaración de retorno, solo toma argumentos de tipos con constexpr cstrs y solo llama aconstexpr funciones.)

La preguntaPor questd::forward descartarconstexpr -ness? es un caso especial de este.

Respuestas a la pregunta(3)

Su respuesta a la pregunta