Что делать, если нужен констевал?

C++23 представит if consteval. Где это будет использоваться и чем оно отличается от constexpr if?

1 ответ

определяет, вызывается ли функция в контексте константного выражения. Предложение мотивирует его введение для случая , когда один намеревается вызвать функцию из функции. Чтобы понять, что это означает, рассмотрим следующий пример.

Предположим, у нас есть consteval функция:

      consteval int f( int i )
{ ... }

может вызываться только в постоянном выражении. С другой стороны constexprФункция может быть вызвана либо в постоянном выражении, либо во время выполнения. Это зависит от того, известны ли аргументы во время компиляции или нет. Теперь звоню f from if вызывается во время компиляции, можно сделать следующим образом.

      constexpr int g( int i )
{
  if consteval {    //1
    return f( i );
  }
  else { 
    return fallback();
  }
}

Здесь в строке срабатывает, если gвызывается в постоянном выражении. Обратите внимание, что в. Также подтяжки после if consteval обязательны.

Представлен C++20 для определения того, происходит ли вызов функции в контексте с постоянной оценкой. Использование в нашем примере приводит к небольшой ошибке. Т.е. обмен //1 от if constexpr (std::is_constant_evaluated()) { приводит к is_constant_evaluated всегда возвращаться true.

Другие вопросы по тегам