You seem to be acting under the belief that if constexpr
is a performance optimization. It isn't. If you put a constant expression in a ?:
clause, any compiler worth using will figure out what it resolves to and remove the condition. So the code as you have written it will almost certainly compile down to a single option, for a particular Mode
.
The principle purpose of if constexpr
is to eliminate the other branch entirely. If used in a template where the condition is based on a template parameter, the compiler skips most of the checks for validity of the code in that branch. This would be for something where you if constexpr(is_default_constructible_v<T>)
, and if it is true, you do T()
. With a regular if
statement, if T
isn't default constructible, T()
will still have to be valid code even if the surrounding if
clause is a constant expression. if constexpr
removes that requirement; the compiler will discard statements that are not in the other condition.
This becomes even more complicated for ?:
, because the expression's type is based on the types of the two values. As such, both expressions need to be legal expressions, even if one of them is never evaluated. A constexpr
form of ?:
would presumably discard the alternative that is not taken at compile time. And therefore the expression's type should really only be based on one of them.
That a very different kind of thing.