Perché il falso ramo di "if constexpr" viene compilato?

Aug 18 2020

Perché questo codice dà un errore durante la compilazione? La mia conoscenza (e anche questo ) di " if constexpr" dice che il elseblocco 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++17flag.

PS Il ";" mancante è intenzionale, solo per verificare se elseviene compilato o meno.

Risposte

7 cigien Aug 18 2020 at 20:13

Ci sono 2 problemi separati, ma correlati qui.

In primo luogo, if constexprcompilerà 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 constexprnon 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.