C++ Academy · Lezione

Funzioni constexpr e if constexpr

Valuti il codice in fase di compilazione con constexpr e dirami con if constexpr

Lezione 4 di 414 passaggi

Funzioni constexpr e if constexpr è una lezione C++ Academy gratuita su CoddyKit. Questa è la lezione 4 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento C++ Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso C++ Academy include 4 lezioni in totale.

Valutazione al momento della compilazione

La parola chiave constexpr comunica al compilatore: «valuta questa espressione al momento della compilazione quando possibile». I calcoli eseguiti durante la compilazione non hanno alcun costo a runtime.

Variabili constexpr

Una variabile constexpr deve essere inizializzata con un'espressione costante. Il risultato viene fissato al momento della compilazione.

constexpr int BUFFER_SIZE = 1024;
constexpr double PI = 3.14159265358979;

Funzioni constexpr

Contrassegni le funzioni come constexpr per consentire la loro esecuzione al momento della compilazione quando vengono chiamate con argomenti costanti.

constexpr int factorial(int n) {
    return (n <= 1) ? 1 : n * factorial(n - 1);
}

constexpr int five_fact = factorial(5);  // computed at compile time

Fallback a runtime

Una funzione constexpr può essere chiamata anche con valori determinati a runtime: in quel caso viene eseguita a runtime.

int n = read_input();
int result = factorial(n);   // runtime call

Limitazioni delle funzioni constexpr

Prima di C++14:

  • Era consentita una sola istruzione return
  • Non erano consentiti i cicli
  • Non era possibile modificare lo stato locale

C++14 ha allentato queste limitazioni; C++17 e C++20 ne hanno aggiunte altre (try-catch, allocazione dinamica, funzioni virtuali).

consteval (C++20)

Forzi la valutazione al momento della compilazione con consteval. Chiamare una funzione consteval con argomenti non costanti provoca un errore.

consteval int square(int x) { return x * x; }

constexpr int c = square(5);    // OK
int x = 5;
// int r = square(x);            // ERROR

constinit (C++20)

constinit garantisce che la variabile venga inizializzata al momento della compilazione, consentendone però la modifica a runtime.

if constexpr (C++17)

if constexpr è un ramo valutato al momento della compilazione. Il ramo non selezionato non viene nemmeno compilato, caratteristica utile nei template.

template <typename T>
void print(const T& value) {
    if constexpr (std::is_pointer_v<T>) {
        std::cout << "pointer: " << *value;
    } else {
        std::cout << value;
    }
}

Eliminare SFINAE

if constexpr sostituisce i complessi pattern SFINAE con una logica condizionale chiara. In combinazione con i type traits, rende il codice generico molto più facile da leggere.

Algoritmi valutati al momento della compilazione

Il C++ moderno permette di scrivere algoritmi sorprendentemente complessi che vengono eseguiti interamente al momento della compilazione: hashing di stringhe, generazione di tabelle e mini-parser.

constexpr auto fnv1a(std::string_view s) {
    uint32_t h = 2166136261u;
    for (char c : s) {
        h = (h ^ static_cast<uint8_t>(c)) * 16777619u;
    }
    return h;
}

constexpr auto x = fnv1a("hello");

Template e constexpr

Le funzioni constexpr generiche sono una combinazione potente: permettono di scrivere codice generico e flessibile rispetto ai tipi, valutato al momento della compilazione.

Diagnostica

Gli errori di compilazione nel codice constexpr vengono segnalati con posizioni dettagliate. I compilatori moderni sono piuttosto efficaci nell'individuare il passaggio che causa il problema.

Verifica rapida

Che cosa fa if constexpr che un normale if non fa?

Riepilogo

constexpr abilita la valutazione al momento della compilazione; consteval la impone; constinit garantisce l'inizializzazione al momento della compilazione. if constexpr seleziona i rami durante la compilazione: il ramo non selezionato non viene mai istanziato, sostituendo SFINAE in molti casi.

Gratis per iniziare

Impara C++ con un tutor IA — gratis

Scrivi ed esegui vero codice nel tuo browser, ricevi aiuto istantaneo da un tutor IA disponibile 24/7, e riprendi da dove hai lasciato sul web o nell'app.

Corsi
51
Lezioni
203

Domande Frequenti

La lezione «Funzioni constexpr e if constexpr» è gratuita?

Sì — il testo completo di «Funzioni constexpr e if constexpr» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso C++ Academy, passa a CoddyKit PRO. Il corso C++ Academy include 4 lezioni in totale.

Cosa imparerò in «Funzioni constexpr e if constexpr»?

Valuti il codice in fase di compilazione con constexpr e dirami con if constexpr Eserciti C++ Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare C++ Academy?

Non è richiesta alcuna esperienza precedente. C++ Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 4 di 4.

Quanto tempo richiede la lezione «Funzioni constexpr e if constexpr»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione C++ Academy?

Sì. Ogni lezione C++ Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Ripasso dei template di funzioni e classi
  2. Specializzazione parziale e completa dei template
  3. Template variadici e parameter pack
  4. Funzioni constexpr e if constexpr
← Torna a C++ Academy