constexpr-funktioner och if constexpr
Utvärdera kod vid kompilering med constexpr och förgrena med if constexpr
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 timeAlternativ 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 callBegrä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); // ERRORconstinit (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.
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
- Funktions- och klasstemplates i repetition
- Templatespecialisering: partiell och fullständig
- Variadiska templates och parameter packs
- constexpr-funktioner och if constexpr