Recently I modify some if constexpr
into if
in my constexpr functions and found they still work fine and can be evaluated when compile time. Here is a minimum case:
template<int N>
constexpr bool is_negative()
{
if constexpr (N >= 0) return false;
else return true;
}
int main()
{
constexpr bool v = is_negative<1>();
}
In the case above, N
must be known at compile time because it is non-type template parameter, so if constexpr
works fine here. However, it is a constexpr function, so, iirc, it is possible to get a return value even though I replace if constexpr
with if
:
template<int N>
constexpr bool is_negative()
{
if (N >= 0) return false;
else return true;
}
int main()
{
constexpr bool v = is_negative<1>();
}
From cppref, all of the requirements in A constexpr function must satisfy the following requirements:
don't mention if
. So, IIUC, it should be implementation defined behavior whether constexpr function contain if
to be evaluted at compile time even though all related variable is known at compile time(like is_negative
above).
So, my conclusion is:
- Before c++17, we don't have
if constexpr
, so the choice isif
, which means it is not guaranteed to get our constexpr functions get evaluted at compile time, all depend on compiler implementation - After c++17,
if constexpr
is preferred if we want constexpr functions get evaluated at compile time.
All above is my personal thoughts, maybe something important missed/misunderstand, feel free to correct me. The question is still unchanged: if
and if constexpr
, which should be prefered for constexpr functions which expected to be evaluated at compile time.
references: - What is Allowed in a constexpr Function? - Difference between "if constexpr()" Vs "if()"