Secondo Generalized Constant Expressions—Revision 5 quanto segue è illegale.Perché è errato avere funzioni constexpr su più righe?
constexpr int g(int n) // error: body not just ‘‘return expr’’
{
int r = n;
while (--n > 1) r *= n;
return r;
}
Questo è perché funzioni tutti 'constexpr' devono essere della forma { return expression; }
. Non vedo alcuna ragione per cui debba essere così.
Nella mia mente, l'unica cosa che sarebbe veramente necessaria è che nessuna informazione di stato esterna sia stata letta/scritta e che i parametri che vengono passati siano anche dichiarazioni di "constexpr". Ciò significherebbe che qualsiasi chiamata alla funzione con gli stessi parametri restituirebbe lo stesso risultato, quindi è possibile "sapere" in fase di compilazione.
Il mio problema principale con questo è che sembra proprio che ti costringa a fare davvero rotonde forme di looping e sperare che il compilatore lo ottimizzi in modo che sia altrettanto veloce per le chiamate non constexpr.
Per scrivere una valida constexpr
per l'esempio di cui sopra si potrebbe fare:
constexpr int g(int n) // error: body not just ‘‘return expr’’
{
return (n <= 1) ? n : (n * g(n-1));
}
Ma questo è molto più difficile da capire e si deve sperare che il compilatore si occupa della ricorsione di coda quando si chiama con parametri che violano i requisiti per const-expr
.
Per me quest'ultimo è molto più leggibile ... – Yuji
Vedere anche: http://stackoverflow.com/questions/8308812/why-is-c11-constexpr-so-restrictive –