Por que o ramo falso de “if constexpr” é compilado?
Por que este código está apresentando erros durante a compilação? Meu conhecimento (e também este ) de " if constexpr" diz que o elsebloco não deve ser compilado.
if constexpr (true) {
int a = 10;
} else {
int b = 10
}
O erro é:
error: expected ‘,’ or ‘;’ before ‘}’ token
Compilador usado: g ++ versão 7.5.0
Durante a compilação usei -std=c++17flag.
PS A falta ';' é intencional, apenas para verificar se elseestá sendo compilado ou não.
Respostas
Existem 2 questões separadas, mas relacionadas aqui.
Em primeiro lugar, if constexprirá apenas compilar condicionalmente um branch dentro de um template. Fora de um modelo, todos os ramos serão compilados e devem ser bem formados.
Em segundo lugar, mesmo em um modelo, o ramo descartado de um if constexprnão pode ser malformado para todas as instâncias possíveis. Este não é o caso do seu código, pois:
int b = 10
está sempre malformado (devido à falta ;).
Portanto, o compilador está correto ao fornecer um erro de compilação. Tecnicamente, se o branch descartado estiver malformado para todas as instanciações, o compilador não precisará fornecer um erro do compilador, mas o código ainda está errado.