Диагностическое правило сигнализирует о том, что возвращаемое значение функции 'std::is_constant_evaluated' никогда не изменится. Это может привести к недостижимому коду.
В рамках данного правила будут рассматриваться две ситуации:
Рассмотрим пример: мы хотим реализовать функцию, в которой будет две версии одного алгоритма, для времени компиляции и для времени выполнения. Для разграничения реализаций будет использоваться функция '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', если вызов происходит:
Функция 'std::is_constant_evaluated' всегда вернёт 'false', если вызов происходит:
Данная диагностика классифицируется как: