En référence à cette question. La base de la constante de l'expression qui est utilisée pour initialiser l' constexpr
variable y
est mal formé. Beaucoup est une.
Mais si j'essaie de tourner la if
en if constexpr
:
template <typename T>
void foo() {
constexpr int x = -1;
if constexpr (x >= 0){
constexpr int y = 1 << x;
}
}
int main(){
foo<int>();
}
L'erreur persiste. Avec GCC 7.2 encore donner:
error: right operand of shift expression '(1 << -1)' is negative [-fpermissive]
Mais j'ai pensé que la sémantique chèque doit être à gauche unpreformed sur un jeté de la branche.
Faire une indirection via un constexpr
lambda ne l'aide, cependant:
template <typename T>
void foo(){
constexpr int x = -1;
constexpr auto p = []() constexpr { return x; };
if constexpr (x >= 0){
constexpr int y = 1<<p();
}
}
L' constexpr
spécificateur sur y
semble modifier la façon dont les rebuts de la branche est cochée. Est-ce le comportement voulu?
@max66 a eu la gentillesse de vérifier d'autres implémentations. Il signale que l'erreur est reproductible avec GCC (7.2.0 / Tête 8.0.0) et Clang (5.0.0 / Tête 6.0.0).