¿Por qué se compila la rama falsa de "if constexpr"?

Aug 18 2020

¿Por qué este código da error durante la compilación? Mi conocimiento (y también esto ) de " if constexpr" dice que el elsebloque 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++17flag.

PD Los desaparecidos ';' es intencional, solo para comprobar si elsese está compilando o no.

Respuestas

7 cigien Aug 18 2020 at 20:13

Aquí hay 2 problemas separados pero relacionados.

En primer lugar, if constexprsolo 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 constexprno 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.