Daily bit(e) C++. if consteval

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

Daily bit(e) C++ 38, вариант выражения if в C++23, проверяющий, вызывается ли код из константно вычисляемого контекста.

Daily bit(e) C++

В C++23 добавлено выражение if consteval, которое может проверять, вызывается ли код из константно вычисляемого контекста.

Это позволяет функциям, которые не могли быть вычислены константно, предоставлять альтернативные реализации.

Обратите внимание, что, хоть это похоже, но отличается от if constexpr, для которого условие всегда вычисляется в константном контексте.

#include <random>

constexpr unsigned add(unsigned a, unsigned b) 
{
    if consteval 
    {
        // ветка consteval, которая может использовать
        // только код, совместимый с константными выражениями
        return a + b;
    } 
    else 
    {
        // не consteval, мы можем использовать такие сложены вещи, 
        // как inline вставки на ассемблере или интристики
        unsigned ret;
        asm("addl %%ebx, %%eax;":"=a"(ret) : "a"(a), "b"(b));
        return ret;
    }
}

std::mt19937 gen;
unsigned v = gen();

unsigned r1 = add(v,v); // будет использовать ассемблерную ветку

constinit static unsigned r2 = add(20,30); 
// будет использовать не ассемблерную ветку

static_assert(add(20,30) == 50); // тоже не ассемблерная ветка


constexpr int side(int arg) 
{
    // if consteval позволяет нам включать побочные эффекты,
    // такие как логирование, в функции, которые так же
    // должны быть вычислены константно
    if not consteval 
    {
        std::println("Not a constant expression, we can safely log.");
    }
    return arg*arg;
}

unsigned r3 = side(3); // будет логирование

static_assert(side(3) == 9); // без логирования

Пример на Compiler Explorer

Теги

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