﻿# V1080\. Call of 'std::is\_constant\_evaluated' function always returns the same value\.

Диагностическое правило сигнализирует о том, что возвращаемое значение функции 'std::is\_constant\_evaluated' никогда не изменится\. Это может привести к недостижимому коду\. 

В рамках данного правила будут рассматриваться две ситуации:

* Данная функция вызывается в контексте, который всегда является контекстом времени компиляции и вернёт 'true'\. 
* Данная функция вызывается в контексте, который всегда является контекстом времени выполнения и вернёт 'false'\.

Рассмотрим пример: мы хотим реализовать функцию, в которой будет две версии одного алгоритма, для времени компиляции и для времени выполнения\. Для разграничения реализаций будет использоваться функция 'std::is\_constant\_evaluated'\.

```cpp
#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'\.

```cpp
#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'\.