Pourquoi la fausse branche de «if constexpr» est-elle compilée?

Aug 18 2020

Pourquoi ce code donne-t-il une erreur lors de la compilation? Ma connaissance (et aussi celle-ci ) de " if constexpr" dit que le elsebloc 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++17drapeau.

PS Les disparus ';' est intentionnel, juste pour vérifier s'il elseest en cours de compilation ou non.

Réponses

7 cigien Aug 18 2020 at 20:13

Il y a 2 problèmes distincts, mais liés ici.

Premièrement, if constexprne 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 constexprne 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é.