Por que o ramo falso de “if constexpr” é compilado?

Aug 18 2020

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

7 cigien Aug 18 2020 at 20:13

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.