if constexpr
в конечном счете было получено из более здравой формы static if
концепции . Из-за этого вывода применение той же идеи к switch
, по-видимому, не рассматривалось комитетом по стандартам. Так что это, вероятно, основная причина: никто не добавил ее в статью, поскольку это была ограниченная форма синтаксиса, где switch
не имело бы смысла.
Как говорится, switch
имеет много багажа. Наиболее заметным моментом является поведение автоматического падения. Это делает определение его поведения немного проблематичным.
Понимаете, одна из возможностей if constexpr
заключается в том, чтобы сбить сторону, не занятую во время компиляции, при определенных условиях. Это важная часть синтаксиса. Поэтому можно предположить, что гипотетический switch constexpr
обладает подобными способностями.
С падением это сделать гораздо сложнее, поскольку блоки case
не так принципиально различны, как два блока оператора if
. Особенно, если у вас условное падение. Теперь вы можете сделать так, чтобы switch constexpr
не имел автоматического падения (или вообще падения), чтобы различные разделы были различны. Но затем вы слегка изменили работу синтаксиса; не constexpr
форма switch
ведет себя не так, как constexpr
форма. Это не хорошо.
Да, вы можете сделать ошибку компиляции, чтобы не ставить операторы break;
между метками.
Обратите внимание, что два основных предложения сопоставления с образцом, P1308 и P1260 , в частности , избегают , используя switch
, вместо этого придумывая новое ключевое слово. У них обоих есть constexpr
аспектов, но они совершенно ясно дают понять, что они не switch/case
.