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: