I\'m trying to compare a function parameter inside a constexpr-if statement.
Here is a simple example:
constexpr bool test_int(const int i) {
if c
From constexpr if:
In a constexpr if statement, the value of condition must be a contextually converted constant expression of type bool.
Then, from constant expression:
Defines an expression that can be evaluated at compile time.
Obviously, i == 5
is not a constant expression, because i
is a function parameter which is evaluated at run time. That is why the compiler complains.
When you use a function:
constexpr bool test_int_no_if(const int i) { return (i == 5); }
then it might be evaluated during the compile time depending on whether it's parameter is known at compile time or not.
If i
is defined like:
constexpr int i = 5;
then the value of i
is known during the compile time and test_int_no_if
might be evaluated during the compile too making it possible to call it inside static_assert
.
Also note, that marking function parameter as const
does not make it a compile time constant. It just means that you cannot change the parameter inside the function.
A constexpr function can be called with non-constexpr arguments, in which case it behaves like a normal function, so the code must still compile as if it were not constexpr.
In short, there's nothing in test_int_no_if that depends on i being constexpr, while in test_int(), there is. ("constexpr if" only works with compile time expressions.)