Funkcje constexpr i if constexpr
Wykonuj kod podczas kompilacji za pomocą constexpr i twórz rozgałęzienia za pomocą if constexpr
Funkcje constexpr i if constexpr to bezpłatna lekcja C++ Academy na CoddyKit. To lekcja 4 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej C++ Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs C++ Academy zawiera 4 lekcji w sumie.
Ewaluacja podczas kompilacji
Słowo kluczowe constexpr informuje kompilator: „oblicz to podczas kompilacji, jeśli to możliwe”. Obliczenia wykonywane podczas kompilacji nie mają kosztu w czasie działania.
Zmienne constexpr
Zmienną constexpr należy zainicjalizować wyrażeniem stałym. Wynik jest ustalany podczas kompilacji.
constexpr int BUFFER_SIZE = 1024;
constexpr double PI = 3.14159265358979;Funkcje constexpr
Oznacz funkcje jako constexpr, aby mogły być wykonywane podczas kompilacji, gdy zostaną wywołane ze stałymi argumentami.
constexpr int factorial(int n) {
return (n <= 1) ? 1 : n * factorial(n - 1);
}
constexpr int five_fact = factorial(5); // computed at compile timeRezerwa na czas działania
Funkcję constexpr można również wywołać z wartościami ustalanymi w czasie działania — w takim przypadku zostanie wykonana w czasie działania.
int n = read_input();
int result = factorial(n); // runtime callOgraniczenia funkcji constexpr
Przed C++14:
- Tylko jedna instrukcja return
- Brak pętli
- Brak modyfikowania lokalnego stanu
C++14 złagodził te ograniczenia, a C++17 i C++20 dodały kolejne możliwości (try-catch, alokację dynamiczną, funkcje wirtualne).
consteval (C++20)
Wymuś ewaluację podczas kompilacji za pomocą consteval. Wywołanie funkcji consteval z argumentami, które nie są stałymi, jest błędem.
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 gwarantuje inicjalizację zmiennej podczas kompilacji, ale pozwala modyfikować ją w czasie działania.
if constexpr (C++17)
if constexpr jest rozgałęzieniem wykonywanym podczas kompilacji. Niewybrana gałąź nie jest nawet kompilowana — jest to przydatne w szablonach.
template <typename T>
void print(const T& value) {
if constexpr (std::is_pointer_v<T>) {
std::cout << "pointer: " << *value;
} else {
std::cout << value;
}
}Eliminowanie SFINAE
if constexpr zastępuje złożone wzorce SFINAE przejrzystą logiką warunkową. W połączeniu z traits typów znacznie ułatwia odczytywanie kodu generycznego.
Algorytmy wykonywane podczas kompilacji
Współczesny C++ pozwala pisać zaskakująco złożone algorytmy wykonywane w całości podczas kompilacji — haszowanie napisów, generowanie tablic i proste parsery.
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");Szablony i constexpr
Generyczne funkcje constexpr stanowią potężne połączenie — pozwalają pisać elastyczny typowo kod generyczny, który jest obliczany podczas kompilacji.
Diagnostyka
Błędy kompilacji w kodzie constexpr są zgłaszane wraz ze szczegółowymi lokalizacjami. Współczesne kompilatory całkiem dobrze wskazują miejsce powodujące problem.
Szybkie sprawdzenie
Co robi if constexpr, czego nie robi zwykłe if?
Podsumowanie
constexpr umożliwia ewaluację podczas kompilacji; consteval jej wymaga; constinit gwarantuje inicjalizację podczas kompilacji. if constexpr rozgałęzia kod podczas kompilacji — niewybrana gałąź nigdy nie jest tworzona jako instancja, dzięki czemu w wielu przypadkach zastępuje SFINAE.
Często zadawane pytania
Czy lekcja „Funkcje constexpr i if constexpr” jest bezpłatna?
Tak — pełny tekst „Funkcje constexpr i if constexpr” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu C++ Academy, przejdź na CoddyKit PRO. Kurs C++ Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Funkcje constexpr i if constexpr”?
Wykonuj kod podczas kompilacji za pomocą constexpr i twórz rozgałęzienia za pomocą if constexpr Ćwiczysz C++ Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć C++ Academy?
Nie wymagamy żadnego doświadczenia. C++ Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 4 z 4.
Ile czasu zajmuje lekcja „Funkcje constexpr i if constexpr”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji C++ Academy?
Tak. Każda lekcja C++ Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Szablony funkcji i klas — powtórzenie
- Specjalizacja szablonów: częściowa i pełna
- Szablony wariadyczne i paczki parametrów
- Funkcje constexpr i if constexpr