Warum wird der falsche Zweig von "if constexpr" kompiliert?
Warum gibt dieser Code beim Kompilieren Fehler aus? Mein Wissen (und auch dieses ) über " if constexpr" besagt, dass der elseBlock nicht kompiliert werden sollte.
if constexpr (true) {
int a = 10;
} else {
int b = 10
}
Der Fehler ist:
error: expected ‘,’ or ‘;’ before ‘}’ token
Verwendeter Compiler: g ++ Version 7.5.0
Beim Kompilieren habe ich -std=c++17flag verwendet.
PS Das fehlende ';' ist beabsichtigt, nur um zu überprüfen, ob elsekompiliert wird oder nicht.
Antworten
Hier gibt es zwei separate, aber verwandte Probleme.
Erstens if constexprwird ein Zweig innerhalb einer Vorlage nur bedingt kompiliert. Außerhalb einer Vorlage werden alle Zweige kompiliert und müssen gut geformt sein.
Zweitens kann selbst in einer Vorlage der verworfene Zweig von if constexprnicht für alle möglichen Instanziierungen schlecht geformt werden. Dies ist in Ihrem Code nicht der Fall, da:
int b = 10
ist immer schlecht geformt (aufgrund des Fehlens ;).
Der Compiler gibt also zu Recht einen Kompilierungsfehler aus. Technisch wird , wenn der verworfene Zweig für alle instantiations schlecht gebildet, dann wird der Compiler nicht erforderlich einen Compiler - Fehler zu geben, aber der Code ist immer noch falsch.