Pourquoi la fausse branche de «if constexpr» est-elle compilée?
Pourquoi ce code donne-t-il une erreur lors de la compilation? Ma connaissance (et aussi celle-ci ) de " if constexpr
" dit que le else
bloc ne devrait pas être compilé.
if constexpr (true) {
int a = 10;
} else {
int b = 10
}
L'erreur est:
error: expected ‘,’ or ‘;’ before ‘}’ token
Compilateur utilisé: g ++ version 7.5.0
Lors de la compilation, j'ai utilisé le -std=c++17
drapeau.
PS Les disparus ';' est intentionnel, juste pour vérifier s'il else
est en cours de compilation ou non.
Réponses
Il y a 2 problèmes distincts, mais liés ici.
Premièrement, if constexpr
ne compilera que conditionnellement une branche dans un modèle. En dehors d'un modèle, toutes les branches seront compilées et doivent être bien formées.
Deuxièmement, même dans un modèle, la branche rejetée d'un an if constexpr
ne peut pas être mal formée pour toutes les instanciations possibles. Ce n'est pas le cas dans votre code, car:
int b = 10
est toujours mal formé (en raison du manque ;
).
Le compilateur a donc raison de donner une erreur de compilation. Techniquement, si la branche rejetée est mal formée pour toutes les instanciations, alors le compilateur n'est pas obligé de donner une erreur de compilation, mais le code est toujours erroné.