Daily bit(e) C++. consteval

Добавлено 22 июля 2026 в 16:10

Daily bit(e) C++ 36, спецификатор consteval в C++20.

Daily bit(e) C++

Спецификатор 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));
}

Пример на Compiler Explorer

Теги

C++ / CppC++20Daily bit(e) C++Программирование