Perché il falso ramo di "if constexpr" viene compilato?
Perché questo codice dà un errore durante la compilazione? La mia conoscenza (e anche questo ) di " if constexpr
" dice che il else
blocco non dovrebbe essere compilato.
if constexpr (true) {
int a = 10;
} else {
int b = 10
}
L'errore è:
error: expected ‘,’ or ‘;’ before ‘}’ token
Compilatore utilizzato: g ++ versione 7.5.0
Durante la compilazione ho usato -std=c++17
flag.
PS Il ";" mancante è intenzionale, solo per verificare se else
viene compilato o meno.
Risposte
Ci sono 2 problemi separati, ma correlati qui.
In primo luogo, if constexpr
compilerà solo in modo condizionale un ramo all'interno di un modello. Al di fuori di un modello, tutti i rami verranno compilati e devono essere ben formati.
In secondo luogo, anche in un modello, il ramo scartato di an if constexpr
non può essere mal formato per tutte le istanze possibili. Questo non è il caso del tuo codice, poiché:
int b = 10
è sempre mal formato (a causa della mancanza ;
).
Quindi il compilatore ha ragione nel dare un errore di compilazione. Tecnicamente, se il ramo scartato è mal formato per tutte le istanze, il compilatore non è tenuto a fornire un errore del compilatore, ma il codice è ancora sbagliato.