Почему компилируется ложная ветвь «if constexpr»?

Aug 18 2020

Почему этот код выдает ошибку при компиляции? Мои знания (а также это ) о " 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компилируется или нет.

Ответы

7 cigien Aug 18 2020 at 20:13

Здесь есть 2 отдельных, но связанных проблемы.

Во-первых, if constexprбудет только условно компилировать ветку в шаблоне. Вне шаблона все ветви будут скомпилированы и должны быть правильно сформированы.

Во-вторых, даже в шаблоне отклоненная ветвь не if constexprможет быть плохо сформирована для всех возможных экземпляров. В вашем коде это не так, поскольку:

int b = 10

всегда плохо сформирован (из-за отсутствия ;).

Итак, компилятор правильно выдал ошибку компиляции. Технически, если отброшенная ветка плохо сформирована для всех экземпляров, компилятор не обязан выдавать ошибку компилятора, но код все равно неверен.