Reputation: 707
I have following code
static constexpr bool condition = true;
int square(int num) {
if constexpr (condition) {
return num * num;
} else {
x
return num;
}
}
int main() {
return square(3);
}
compiled with
-std=gnu++17
My assumption for
if constexpr (condition)
was that during compilation the part
} else {
x
return num;
}
get discarded and I get no error about the undefined
x
Is my understanding wrong that this 'if constexpr' is something like
#ifdef CONDITION
return num * num;
#else
x
return num;
#endif
How do I modify this code that I can compile this?
Upvotes: 2
Views: 383
Reputation: 409
As you've observed, you can't have "garbage code" like that x
codeline inside of a if constexpr
clause.
The major advantage of having if constexpr
instead of #if
is that if constexpr
is able to reason about types in a way that the preprocessor wasn't able to. This advantage is often exploited within templates.
For example, you could do something like the following:
template <typename T>
T squareOnlyInt(T num) {
if constexpr (std::is_same<T,int>::value) {
return num * num;
}
else {
return num;
}
}
Upvotes: -2
Reputation: 38267
How do I modify this code that I can compile this?
To fix your code, simply remove the line with x
.
Is my understanding wrong that this 'if constexpr' is something like [...]
Yes, your understanding is wrong. From cppreference:
Outside a template, a discarded statement is fully checked.
if constexpr
is not a substitute for the#if
preprocessing directive.
This means every branch in an if constexpr
block must be valid C++, even if it's never going to be used.
Upvotes: 8