C++1z présentera "constexpr si" - si un qui sera l'une des branches supprimées, en fonction de l'état. Semble raisonnable et utile.
Cependant, il n'est pas possible de le faire sans constexpr mot-clé? Je pense que lors de la compilation, le compilateur doit savoir si la condition est connue lors de la compilation du temps ou pas. Si elle l'est, même le plus basique niveau d'optimisation devrait supprimer les branche.
Par exemple (voir dans godbolt: https://godbolt.org/g/IpY5y5):
int test() {
const bool condition = true;
if (condition) {
return 0;
} else {
// optimized out even without "constexpr if"
return 1;
}
}
Godbolt explorer montre, que même gcc-4.4.7 avec -O0 n'a pas compiler "return 1", de sorte qu'il atteint ce qui était promis avec constexpr si. Manifestement, l'ancien compilateur ne sera pas en mesure de le faire lorsque la condition est le résultat de la constexpr fonction, mais le fait demeure: moderne compilateur sait si la condition est constexpr ou pas et n'a pas besoin de moi pour le dire explicitement.
La question est donc:
Pourquoi "constexpr" nécessaire "constexpr si"?