Daily bit(e) C++. consteval
Добавлено 22 июля 2026 в 16:10
Daily bit(e) C++ 36, спецификатор consteval в C++20.

Спецификатор consteval был введен в C++20 для обозначения функций, вычисляемых строго во время компиляции.
Это контрастирует с поведением спецификатора constexpr, который позволяет вычислять функцию и во время компиляции, и во время выполнения. Хотя это потенциально позволяет избежать дублирования кода, это также может быть недостатком, когда нам нужно принудительно вычислять функцию во время компиляции (что может быть непросто).
#include <utility>
constexpr int sum(int a, int b)
{
return a + b;
}
consteval int product(int a, int b)
{
return a * b;
}
consteval int product_until(int limit)
{
int result = 1;
for (int i = 2; i <= limit; ++i)
{
// result и i не являются константными выражениями,
// но мы в consteval функции,
// следовательно мы можем вызвать product
result = product(result, i);
}
return result;
}
// Обертка, которая принуждает к вычислению во время компиляции
consteval decltype(auto) at_compile(auto&& arg)
{
return std::forward<decltype(arg)>(arg);
}
int main(int argc, char**)
{
// И constexpr, и consteval могут использоваться в константных выражениях
static_assert(sum(1,2) == 3);
static_assert(product(2,3) == 6);
int a = sum(argc,argc);
// a == 2 (for argc == 1)
// Не скомпилировалось бы, т.к. argc - это не константное выражение
// int b = product(argc,argc);
static_assert(product_until(5) == 120);
// sum теперь принуждается к вычислению во время компиляции
int c = at_compile(sum(1,2));
// Не скомпилировалось бы, не константное выражение
// int d = at_compile(sum(argc,argc));
}
