Mediumconstexprcompile-time

Что такое constexpr и чем отличается от const?

1Постановка

Разберём, что от вас хотят в этом вопросе и как к нему подступиться на собеседовании.

2Решение

const — значение не меняется после инициализации (может быть в рантайме). constexpr (C++11) — значение или результат функции может вычисляться на этапе компиляции (обязано для переменных).

const int x = getRand();     // OK: инициализация в рантайме
constexpr int y = 42;        // вычислено на компиляции
// constexpr int z = getRand(); // ОШИБКА: не constexpr-выражение

constexpr int factorial(int n) {
    return n <= 1 ? 1 : n * factorial(n - 1);
}
static_assert(factorial(5) == 120);  // compile-time
int x = factorial(rand() % 10);      // runtime

constexpr-переменная неявно const, но const не обязательно constexpr. constexpr-функция может вызываться и в compile, и в runtime. В C++14 разрешили if/циклы/локальные переменные, в C++20 — ещё больше ослабили.

3Как отвечать

  • Сначала уточните условия и ограничения, покажите аналитическое мышление.
  • Рассуждайте вслух — интервьюеру важен ход мысли, а не только финальный ответ.
  • Оцените сложность по времени и памяти (Big-O), если это алгоритмический вопрос.
💡

На реальном собеседовании Alffert подскажет развёрнутый ответ в реальном времени.