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 else
bloco 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++17
flag.
PS A falta ';' é intencional, apenas para verificar se else
está sendo compilado ou não.
Respostas
Existem 2 questões separadas, mas relacionadas aqui.
Em primeiro lugar, if constexpr
irá 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 constexpr
nã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.