Por que ** não ** declara uma função como `constexpr`?

Qualquer função que consiste apenas em uma declaração de retorno pode ser declaradaconstexpr e, portanto, permitirá ser avaliado em tempo de compilação se todos os argumentos foremconstexpr e somenteconstexpr funções são chamadas em seu corpo.Existe alguma razão para não declararqualquer tal funçãoconstexpr ?

Exemplo:

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

Alguém poderia dar um exemplo em que declarar uma funçãoconstexpr faria algum mal?

Alguns pensamentos iniciais:

Mesmo que não exista uma boa razão para declarar uma função que não sejaconstexpr Eu poderia imaginar que oconstexpr A palavra-chave tem um papel transitório: sua ausência no código que não precisa de avaliações em tempo de compilação permitiria que os compiladores que ainda não implementam avaliações em tempo de compilação compilem esse código (mas falhem de maneira confiável no código que precisa deles conforme explicitado usandoconstexpr)

Mas o que eu não entendo: se não deve haver uma boa razão para sempre declarar uma função nãoconstexprporque nãocada função na biblioteca padrão declaradaconstexpr? (Você não pode argumentar que ainda não foi feito porque ainda não havia tempo suficiente para fazê-lo, porque fazê-lo portudo é um acéfalo - ao contrário de decidir para cada função se fazê-loconstexpr ou não.) --- Estou ciente de queN2976 deliberadamente não requer cstrs para muitos tipos de biblioteca padrão, como os contêineres, pois isso seria muito limitador para possíveis implementações. Vamos excluí-los do argumento e nos perguntar: uma vez que um tipo na biblioteca padrão realmente tenha umconstexpr cstr, por que nem todas as funções que operam nele são declaradasconstexpr?

Na maioria dos casos, você também não pode argumentar que pode preferir não declarar uma funçãoconstexpr simplesmente porque você não prevê nenhum uso em tempo de compilação: porque se outros evtl. usarão seu código, eles poderão ver tal uso que você não. (Mas concedido para tipos de características e coisas semelhantes, é claro.)

Acho que deve haver uma boa razão e um bom exemplo para não declarar uma função deliberadamenteconstexpr?

(com "todas as funções" eu sempre quero dizer: todas as funções que atendem aos requisitos de serconstexpr, ou seja, é definido como uma única declaração de retorno, recebe apenas argumentos de tipos com constexpr cstrs e chama apenasconstexpr funções.)

A questãoPorquestd::forward descartarconstexpr-ness? é um caso especial deste.

questionAnswers(3)

yourAnswerToTheQuestion