Utility of constexpr
?
A trivial example... if you write the following function
template <typename T>
auto foo (T const & val)
{
if ( true == std::is_same_v<T, std::string>> )
return val.size()
else
return val;
}
and call it with an integer
foo(42);
you get a compilation error, because the instruction
val.size();
has to be instantiated also when val
is an int
but, unfortunately, int
isn't a class with a size()
method
But if you add constexpr
after the if
// VVVVVVVVV
if constexpr ( true == std::is_same_v<T, std::string>> )
return val.size()
now the return val.size();
instruction is instantiated only when T
is std::string
, so you can call foo()
also with arguments without a size()
method.
---- EDIT ----
As @prapin observed in a comment (thanks!), if constexpr
can be necessary for an auto
function.
I propose another trivial (and silly) example
Without if constexpr
, the following bar()
function
template <typename T>
auto bar (T const &)
{
if ( true == std::is_same_v<T, std::string>> )
return 42;
else
return 42L;
}
doesn't compile, because the first return
return a int
value, the second return a long
; so, given that without if constexpr
the compiler must instantiate both return
's, so the compiler can't conciliate the return
s types and can't determine the return type of the function.
With if constexpr
,
if constexpr ( true == std::is_same_v<T, std::string>> )
return 42;
else
return 42L;
the compiler instantiate the first return
or the second one; never both. So the compiler ever determine the type returned from the function (int
when called with a std::string
, long
otherwise).