Hardconsteval
Чем consteval функция отличается от constexpr?
1Постановка
Разберём, что от вас хотят в этом вопросе и как к нему подступиться на собеседовании.
2Решение
constexpr функция может вычисляться в compile-time или runtime. consteval (C++20, immediate function) — только compile-time; вызов с runtime-аргументами это compile-ошибка.
constexpr int sq(int x) { return x * x; } // compile и runtime
consteval int sqEval(int x) { return x * x; } // только compile
int n = std::atoi("5");
int a = sq(n); // OK: runtime
// int b = sqEval(n); // ОШИБКА: consteval требует compile-time
static_assert(sqEval(3) == 9); // OK: compile-time
// constinit: static-переменная с обязательной компайл-тайм инициализацией
constinit int g = sq(5); // 25, инициализировано до mainТри ключевых слова:
- constexpr — compile и runtime;
- consteval — только compile (format string validation, reflection, asserts);
- constinit — только компайл-тайм инициализация static переменной (не делает const).
consteval-функция может вызывать constexpr, но не наоборот в runtime контексте.
3Как отвечать
- Сначала уточните условия и ограничения, покажите аналитическое мышление.
- Рассуждайте вслух — интервьюеру важен ход мысли, а не только финальный ответ.
- Оцените сложность по времени и памяти (Big-O), если это алгоритмический вопрос.
💡
На реальном собеседовании Alffert подскажет развёрнутый ответ в реальном времени.