The diagnostic rule warns that the 'std::is_constant_evaluated' function's return value has no ability to ever change. This may lead to unreachable code.
This rule covers two cases:
Example: we need to write a function that would contain two versions of one algorithm - one version for compile-time, the other version for runtime. We'll use the 'std::is_constant_evaluated' function to differentiate between these two implementations.
#include <type_traits>
constexpr void foo()
{
constexpr auto context = std::is_constant_evaluated();
//....
if (context)
{
// compile-time logic
}
else
{
// runtime logic
}
}
Here the 'std::is_constant_evaluated' function always returns 'true'. The 'else' branch contains unreachable code.
The opposite situation may happen if we remove the 'costexpr' specifier from the 'context' variable and from the 'foo' function.
#include <type_traits>
void foo()
{
auto context = std::is_constant_evaluated();
//....
if (context)
{
// compile-time logic
}
else
{
// runtime logic
}
}
Here the 'context' variable is always 'false'. The code becomes unreachable as early as the 'then' branch.
The 'std::is_constant_evaluated' always returns 'true' if called in one of the following locations:
The 'std::is_constant_evaluated' always returns 'true' if called here:
This diagnostic is classified as: