# 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'.

Данная диагностика классифицируется как:

CWE-570 CWE-571