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);
The easiest way to check whether a function (e.g., foo ) is constexpr is to assign its return value to a constexpr as below: constexpr auto i = foo(); if the returned value is not constexpr compilation will fail.
Short answer: static_assert(false) should never appear in a constexpr if expression, regardless of whether it's in a template function or whether it's in the discarded branch.
Constexpr ifIf the value is true, then statement-false is discarded (if present), otherwise, statement-true is discarded.
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 ...
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With