V1080. Call of 'std::is_constant_evaluated' function always returns the same value.
Диагностическое правило сигнализирует о том, что возвращаемое значение функции 'std::is_constant_evaluated' никогда не изменится. Это может привести к недостижимому коду.
В рамках данного правила будут рассматриваться две ситуации:
- Данная функция вызывается в контексте, который всегда является контекстом времени компиляции и вернёт 'true'.
- Данная функция вызывается в контексте, который всегда является контекстом времени выполнения и вернёт 'false'.
Рассмотрим пример: мы хотим реализовать функцию, в которой будет две версии одного алгоритма, для времени компиляции и для времени выполнения. Для разграничения реализаций будет использоваться функция 'std::is_constant_evaluated'.
#include <type_traits>
constexpr void foo()
{
constexpr auto context = std::is_constant_evaluated();
//....
if (context)
{
// compile-time logic
}
else
{
// runtime logic
}
}
В данном случае функция 'std::is_constant_evaluated' всегда возвращает 'true'. В 'else'-ветке находится недостижимый код.
Обратная ситуация может возникнуть, если мы уберём спецификатор 'constexpr' с переменной 'context' и функции 'foo'.
#include <type_traits>
void foo()
{
auto context = std::is_constant_evaluated();
//....
if (context)
{
// compile-time logic
}
else
{
// runtime logic
}
}
Здесь переменная 'context' всегда 'false', и код недостижим уже в 'then'-ветке.
Функция 'std::is_constant_evaluated' всегда вернёт 'true', если вызов происходит:
- внутри 'static_assert';
- внутри 'consteval' функции;
- внутри условия 'if constexpr'.
Функция 'std::is_constant_evaluated' всегда вернёт 'false', если вызов происходит:
- внутри функции, непомеченной спецификаторами 'constexpr' / 'consteval'.
Данная диагностика классифицируется как: