consteval în C++

Definește o funcție imediată: fiecare apel trebuie calculat la compilare, altfel programul nu se compilează.

Sintaxă
consteval int functie(int x) { ... }

Ce face consteval

consteval este varianta strictă a lui constexpr pentru funcții. O funcție consteval poate fi apelată doar cu argumente cunoscute la compilare, iar rezultatul este calculat întotdeauna de compilator. Dacă o apelezi cu o valoare de la rulare, primești eroare de compilare.

Este utilă când vrei garanția că un calcul nu costă nimic la rulare sau când vrei să verifici date la compilare (de exemplu formatul unui text constant). std::format folosește acest mecanism ca să verifice șabloanele de formatare la compilare.

Exemple

Exemplul 1: Calcul garantat la compilare

#include <print>

consteval int secunde(int ore, int minute) {
    return ore * 3600 + minute * 60;
}

int main() {
    constexpr int durata_film = secunde(2, 15);
    std::println("Filmul durează {} secunde", durata_film);
    std::println("O zi are {} secunde", secunde(24, 0));
}

Rezultat

Filmul durează 8100 secunde
O zi are 86400 secunde

Exemplul 2: Validare la compilare

Dacă procentul ar fi peste 100 (de exemplu reducere(150)), throw într-o funcție consteval face ca programul să nu se mai compileze: greșeala este prinsă înainte de rulare.

#include <print>

consteval double reducere(int procent) {
    if (procent < 0 || procent > 100) {
        throw "procent invalid";
    }
    return procent / 100.0;
}

int main() {
    double pret = 200;
    std::println("Preț redus: {} lei", pret * (1 - reducere(25)));
}

Rezultat

Preț redus: 150 lei

Greșeli frecvente

  • Apelezi funcția cu o variabilă obișnuită: int ore = 2; secunde(ore, 0);. Nu se compilează, pentru că ore nu este cunoscut la compilare. Fie faci variabila constexpr, fie folosești constexpr în loc de consteval la funcție.
  • Încerci să iei adresa unei funcții consteval ca s-o salvezi într-un pointer pentru rulare. Nu este permis: funcția nu există în programul final.

Comenzi înrudite

  • constexpr: Cere ca o valoare să fie calculată la compilare; o funcție constexpr poate rula atât la compilare, cât și la rulare.
  • constinit: Garantează că o variabilă globală sau statică este inițializată la compilare, dar fără să o facă constantă.
  • static_assert: Verifică o condiție la compilare; dacă este falsă, compilarea se oprește cu mesajul dat.