Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

Tags:

c++

c++17

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); 
like image 542
W.H Avatar asked Dec 27 '18 12:12

W.H


People also ask

How do I know if a function is constexpr?

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.

Which is false about constexpr?

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.

What does if constexpr do?

Constexpr ifIf the value is true, then statement-false is discarded (if present), otherwise, statement-true is discarded.


1 Answers

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 ...

like image 193
Jans Avatar answered Sep 17 '22 14:09

Jans