How to assert that a constexpr if else clause never happen?

  • A+
Category:Languages

I want to raise a compile time error when non of the constexpr if conditions is true eg:

if constexpr(condition1){     ... } else if constexpr (condition2) {    .... } else if constexpr (condition3) {   .... } else {     // I want the else clause never taken. But I heard the code below is not allowed     static_assert(false); }  // I'd rather not repeat the conditions again like this: static_assert(condition1 || condition2 || condition3); 

 


You have to make the discarded statement dependent of the template parameters

template <class...> constexpr std::false_type always_false{};  if constexpr(condition1){     ... } else if constexpr (condition2) {    .... } else if constexpr (condition3) {   .... } else {            static_assert(always_false<T>); } 

This is so because

[temp.res]/8 - The program is ill-formed, no diagnostic required, if

no valid specialization can be generated for a template or a substatement of a constexpr if statement within a template and the template is not instantiated, or ...

Comment

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: