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ãoconstexpr
porque 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.