¿Por qué se compila la rama falsa de "if constexpr"?
¿Por qué este código da error durante la compilación? Mi conocimiento (y también esto ) de " if constexpr
" dice que el else
bloque no debería compilarse.
if constexpr (true) {
int a = 10;
} else {
int b = 10
}
El error es:
error: expected ‘,’ or ‘;’ before ‘}’ token
Compilador usado: g ++ versión 7.5.0
Mientras compilaba usé -std=c++17
flag.
PD Los desaparecidos ';' es intencional, solo para comprobar si else
se está compilando o no.
Respuestas
Aquí hay 2 problemas separados pero relacionados.
En primer lugar, if constexpr
solo compilará condicionalmente una rama dentro de una plantilla. Fuera de una plantilla, todas las ramas se compilarán y deben estar bien formadas.
En segundo lugar, incluso en una plantilla, la rama descartada de an if constexpr
no puede estar mal formada para todas las instancias posibles. Este no es el caso en su código, ya que:
int b = 10
siempre está mal formado (debido a la falta ;
).
Entonces, el compilador tiene razón al dar un error de compilación. Técnicamente, si la rama descartada está mal formada para todas las instancias, entonces no se requiere que el compilador dé un error de compilación, pero el código sigue siendo incorrecto.