if constexpr
, когда условие истинно, не устраняет код вне соответствующего блока else
.
Вы можете расширить C ++, чтобы сделать это, но это быстро становится проблемой.Очевидны только самые тривиальные случаи, и указание, что такое тривиальные случаи, является болью.Я имею в виду, вы покрываете:
if constexpr( blah ){
if (true) return 7;
}
?Как насчет
if constexpr( blah ){
if (blah) return 7;
else exit(-1);
}
?Или
if constexpr( blah ){
if (blah) return 7;
else return false;
}
или
if constexpr( blah ){
if (blah) goto foo;
return false;
foo: return true;
}
или как насчет:
if constexpr( blah ){
std::size_t count = 0;
while (foo != 1 && (++count < (std::size_t)-1))
switch (foo%2) {
case 1: foo = 3*foo+1;
case 0: foo = foo/2;
}
}
if (count < (std::size_t)-1) return true;
}
?Я могу придумать почти непрерывный ряд случаев, которые немного более или менее «очевидны» в их никогда не возвращающемся.И окупаемость?Не имея else
.Много проблем, мало пользы.
Компиляторы имеют специальные правила для обнаружения недоступного кода и тому подобное.Они не должны быть так формально определены как стандарт, и они могут отличаться от одного компилятора к другому.
Стандарт, тем временем, должен быть одинаковым для каждого компилятора.И правила для того, что есть, а что нет, должны быть идентичны.
Стандарт применяет простое правило;блоки if
и else
являются единственными кандидатами для исключения.
Таким образом, стандарт этого не делает.Если вы хотите, чтобы код был удален, поместите его в if constexpr
или else
блок if constexpr
.Ресурсы по развитию языка лучше расходуются на вещи, которые приносят больше прибыли и являются менее болезненными.