C++ Academy · Lektion

constexpr-funktioner och if constexpr

Utvärdera kod vid kompilering med constexpr och förgrena med if constexpr

Lektion 4 av 414 steg

constexpr-funktioner och if constexpr är en gratis lektion i C++ Academy på CoddyKit. Detta är lektion 4 av 4. Du kan läsa vilka 3 lektioner som helst i den här lärvägen kostnadsfritt i sin helhet – därefter låser CoddyKit PRO upp alla lektioner, plus praktisk övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Den ingår i lärvägen för C++ Academy, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i C++ Academy innehåller totalt 4 lektioner.

Utvärdering vid kompilering

Nyckelordet constexpr talar om för kompilatorn att "utvärdera detta vid kompilering när det är möjligt". Beräkningar vid kompilering har ingen körtidskostnad.

constexpr-variabler

En constexpr-variabel måste initieras med ett konstant uttryck. Resultatet är fastställt vid kompilering.

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

constexpr-funktioner

Markera funktioner som constexpr för att tillåta att de körs vid kompilering när de anropas med konstanta argument.

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

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

Alternativ vid körning

En constexpr-funktion kan också anropas med värden från körning – i så fall körs den vid körning.

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

Begränsningar för constexpr-funktioner

Före C++14:

  • Endast en return-sats
  • Inga loopar
  • Ingen ändring av lokalt tillstånd

C++14 lättade på dessa begränsningar; C++17 och C++20 lade till fler möjligheter (try-catch, dynamisk allokering, virtuella funktioner).

consteval (C++20)

Tvinga fram utvärdering vid kompilering med consteval. Att anropa en consteval-funktion med icke-konstanta argument är ett fel.

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 garanterar att variabeln initieras vid kompilering, men tillåter ändringar vid körning.

if constexpr (C++17)

if constexpr är en gren som avgörs vid kompilering. Den gren som inte väljs kompileras inte alls – användbart för mallar.

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

Eliminera SFINAE

if constexpr ersätter komplexa SFINAE-mönster med tydlig villkorslogik. I kombination med type traits blir generisk kod mycket lättare att läsa.

Algoritmer vid kompilering

Med modern C++ kan du skriva förvånansvärt komplexa algoritmer som körs helt vid kompilering – hashning av strängar, tabellgenerering och miniparsrar.

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");

Mallar plus constexpr

Generiska constexpr-funktioner är en kraftfull kombination – skriv generisk kod som fungerar med olika typer och utvärderas vid kompilering.

Diagnostik

Fel vid kompilering i constexpr-kod rapporteras med detaljerade positioner. Moderna kompilatorer är ganska bra på att peka ut det felande steget.

Snabbkontroll

Vad gör if constexpr som en vanlig if inte gör?

Sammanfattning

constexpr möjliggör utvärdering vid kompilering; consteval tvingar fram den; constinit garanterar initiering vid kompilering. if constexpr väljer gren vid kompilering – grenen som inte väljs instansieras aldrig, vilket i många fall ersätter SFINAE.

Gratis att börja

Lär dig C++ med en AI-lärare – gratis

Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.

Kurser
51
Lektioner
203

Vanliga frågor

Är lektionen ”constexpr-funktioner och if constexpr” gratis?

Ja – du kan läsa vilka 3 lektioner som helst i lärvägen C++ Academy, inklusive ”constexpr-funktioner och if constexpr”, kostnadsfritt i sin helhet här på webben. Därefter låser CoddyKit PRO upp alla lektioner, plus interaktiv övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Kursen i C++ Academy innehåller totalt 4 lektioner.

Vad lär jag mig i ”constexpr-funktioner och if constexpr”?

Utvärdera kod vid kompilering med constexpr och förgrena med if constexpr Ni övar på C++ Academy med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.

Behöver jag någon erfarenhet för att börja lära mig C++ Academy?

Du behöver inga förkunskaper. Utbildningen i C++ Academy på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 4 av 4.

Hur lång tid tar lektionen ”constexpr-funktioner och if constexpr”?

De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.

Kan jag skriva och köra kod i den här C++ Academy-lektionen?

Ja. Varje C++ Academy-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.

Alla lektioner i den här kursen

  1. Funktions- och klasstemplates i repetition
  2. Templatespecialisering: partiell och fullständig
  3. Variadiska templates och parameter packs
  4. constexpr-funktioner och if constexpr
← Tillbaka till C++ Academy