Функции constexpr и if constexpr
Вычисляйте код во время компиляции с помощью constexpr и выполняйте ветвление через if constexpr.
«Функции constexpr и if constexpr» — бесплатный урок C++ Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения C++ Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс C++ Academy содержит 4 уроков всего.
Вычисления во время компиляции
Ключевое слово constexpr сообщает компилятору: «вычислите это во время компиляции, если возможно». Вычисления во время компиляции не требуют затрат при выполнении.
Переменные constexpr
Переменная constexpr должна быть инициализирована константным выражением. Результат фиксируется во время компиляции.
constexpr int BUFFER_SIZE = 1024;
constexpr double PI = 3.14159265358979;Функции constexpr
Помечайте функции как constexpr, чтобы разрешить их выполнение во время компиляции при вызове с константными аргументами.
constexpr int factorial(int n) {
return (n <= 1) ? 1 : n * factorial(n - 1);
}
constexpr int five_fact = factorial(5); // computed at compile timeРезервный вариант во время выполнения
Функцию constexpr также можно вызвать со значениями, известными только во время выполнения. В таком случае она выполняется во время выполнения.
int n = read_input();
int result = factorial(n); // runtime callОграничения функций constexpr
До C++14:
- Только один оператор возврата
- Без циклов
- Без изменения локального состояния
C++14 смягчил эти ограничения, а C++17 и C++20 добавили новые возможности (try-catch, динамическое выделение памяти и виртуальные функции).
consteval (C++20)
Принудительно выполняйте вычисления во время компиляции с помощью consteval. Вызов функции consteval с неконстантными аргументами является ошибкой.
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 гарантирует инициализацию переменной во время компиляции, но допускает её изменение во время выполнения.
if constexpr (C++17)
if constexpr — это ветвление во время компиляции. Невыбранная ветвь даже не компилируется, что особенно полезно для шаблонов.
template <typename T>
void print(const T& value) {
if constexpr (std::is_pointer_v<T>) {
std::cout << "pointer: " << *value;
} else {
std::cout << value;
}
}Отказ от SFINAE
if constexpr заменяет сложные шаблоны SFINAE понятной условной логикой. В сочетании с признаками типов эта конструкция значительно упрощает чтение обобщённого кода.
Алгоритмы, выполняемые во время компиляции
Современный C++ позволяет писать удивительно сложные алгоритмы, полностью выполняемые во время компиляции: хеширование строк, генерацию таблиц и небольшие анализаторы.
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");Шаблоны и constexpr
Обобщённые функции constexpr — мощное сочетание: они позволяют писать обобщённый код, гибкий для разных типов, и вычислять его во время компиляции.
Диагностика
Ошибки во время компиляции в коде constexpr сообщаются с подробным указанием места возникновения. Современные компиляторы довольно хорошо находят проблемный шаг.
Быстрая проверка
Что делает if constexpr такого, чего не делает обычный if?
Итоги
constexpr включает вычисления во время компиляции, consteval принудительно требует их, а constinit гарантирует инициализацию во время компиляции. if constexpr выполняет ветвление во время компиляции: невыбранная ветвь никогда не создаётся как экземпляр, что во многих случаях заменяет SFINAE.
Часто задаваемые вопросы
Урок «Функции constexpr и if constexpr» бесплатный?
Да — полный текст урока «Функции constexpr и if constexpr» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс C++ Academy, подпишись на CoddyKit PRO. Курс C++ Academy содержит 4 уроков всего.
Чему я научусь в уроке «Функции constexpr и if constexpr»?
Вычисляйте код во время компиляции с помощью constexpr и выполняйте ветвление через if constexpr. Ты практикуешь C++ Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать C++ Academy?
Предыдущий опыт не требуется. C++ Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.
Сколько времени занимает урок «Функции constexpr и if constexpr»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке C++ Academy?
Да. Каждый урок C++ Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Шаблоны функций и классов: повторение
- Специализация шаблонов: частичная и полная
- Вариативные шаблоны и пакеты параметров
- Функции constexpr и if constexpr