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); // runtimeconstexpr-переменная неявно const, но const не обязательно constexpr. constexpr-функция может вызываться и в compile, и в runtime. В C++14 разрешили if/циклы/локальные переменные, в C++20 — ещё больше ослабили.
3Как отвечать
- Сначала уточните условия и ограничения, покажите аналитическое мышление.
- Рассуждайте вслух — интервьюеру важен ход мысли, а не только финальный ответ.
- Оцените сложность по времени и памяти (Big-O), если это алгоритмический вопрос.
💡
На реальном собеседовании Alffert подскажет развёрнутый ответ в реальном времени.