C++ Academy · Lektion

consteval och constinit

Moderna nyckelord för kompileringstid

Lektion 4 av 413 steg

consteval och constinit ä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.

Bortom constexpr

C++20 lägger till två nyckelord som ger mer exakt programmering vid kompilering: consteval för funktioner som garanterat körs vid kompilering och constinit för garanterad initiering vid kompilering.

consteval: omedelbara funktioner

En consteval-funktion måste utvärderas vid kompilering. Till skillnad från constexpr kan den aldrig köras under körning.

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

int main() {
    constexpr int c = cube(3);   // OK: compile time
    return c;
}

consteval avvisar anrop under körning

Att anropa en consteval-funktion med ett värde som bestäms under körning är ett kompileringsfel – garantin upprätthålls.

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

int main() {
    int n = 4;
    // int bad = cube(n);   // ERROR: n is not a constant
    return cube(2);
}

Varför consteval?

Använd det när en beräkning inte har någon mening under körning – till exempel för att generera en konstant tabell eller validera en literal vid kompilering.

constexpr kontra consteval

constexpr-funktioner kan köras vid kompilering; consteval-funktioner gör det alltid. Välj consteval för att förbjuda oavsiktlig användning under körning.

constinit: garanterad statisk initiering

constinit garanterar att en statisk eller trådlokal variabel initieras vid kompilering, vilket eliminerar problemet med ordningen för statisk initiering.

constinit int globalCount = 10;   // initialized at compile time

int main() {
    return globalCount;
}

constinit är inte const

Till skillnad från constexpr kan en constinit-variabel fortfarande ändras efter initieringen vid kompilering – det begränsar bara hur den initieras.

constinit int counter = 0;

int main() {
    counter = 5;   // OK: constinit allows mutation
    return counter;
}

Lös problemet med initieringsordningen

För icke-lokala statiska variabler i olika översättningsenheter tvingar constinit fram statisk (vid kompilering) initiering, så värdet är klart innan någon dynamisk initiering körs.

Jämförelse av tre nyckelord

constexpr: kan vara vid kompilering, är const. consteval: måste vara vid kompilering (funktioner). constinit: tvingar fram initiering vid kompilering och förblir ändringsbar.

Kompilatorstöd

Detta är funktioner i C++20. Kompilera med -std=c++20 (eller senare) på GCC/Clang, eller /std:c++20 på MSVC.

Välj rätt verktyg

Använd consteval för att tvinga fram beräkningar vid kompilering och constinit för att göra statisk initiering deterministisk – tillsammans gör de C++-kod vid kompilering säkrare.

Snabbtest

Testa din förståelse av consteval och constinit.

Sammanfattning

Du har lärt dig om C++20-nyckelorden consteval (funktioner som måste köras vid kompilering) och constinit (garanterad initiering vid kompilering för statiska variabler, som fortfarande kan ändras). Tillsammans med constexpr ger de exakt kontroll över utvärdering vid kompilering.

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 ”consteval och constinit” gratis?

Ja – du kan läsa vilka 3 lektioner som helst i lärvägen C++ Academy, inklusive ”consteval och constinit”, 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 ”consteval och constinit”?

Moderna nyckelord för kompileringstid 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 ”consteval och constinit”?

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. const-variabler och parametrar
  2. const-medlemsfunktioner
  3. constexpr och kompileringstid
  4. consteval och constinit
← Tillbaka till C++ Academy