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ăorenu este cunoscut la compilare. Fie faci variabilaconstexpr, fie foloseșticonstexprîn loc deconstevalla funcție. - Încerci să iei adresa unei funcții
constevalca 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.