Что делать, если нужен констевал?
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
.