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 подскажет развёрнутый ответ в реальном времени.