Почему компилируется ложная ветвь «if constexpr»?
Почему этот код выдает ошибку при компиляции? Мои знания (а также это ) о " if constexpr
" говорят, что else
блок не должен компилироваться.
if constexpr (true) {
int a = 10;
} else {
int b = 10
}
Ошибка:
error: expected ‘,’ or ‘;’ before ‘}’ token
Используемый компилятор: g ++ версии 7.5.0
При компиляции я использовал -std=c++17
флаг.
PS Пропавший ';' намеренно, просто чтобы проверить, else
компилируется или нет.
Ответы
Здесь есть 2 отдельных, но связанных проблемы.
Во-первых, if constexpr
будет только условно компилировать ветку в шаблоне. Вне шаблона все ветви будут скомпилированы и должны быть правильно сформированы.
Во-вторых, даже в шаблоне отклоненная ветвь не if constexpr
может быть плохо сформирована для всех возможных экземпляров. В вашем коде это не так, поскольку:
int b = 10
всегда плохо сформирован (из-за отсутствия ;
).
Итак, компилятор правильно выдал ошибку компиляции. Технически, если отброшенная ветка плохо сформирована для всех экземпляров, компилятор не обязан выдавать ошибку компилятора, но код все равно неверен.