Mediumconstexpr
Что такое constexpr-функция и какие у неё ограничения?
1Постановка
Разберём, что от вас хотят в этом вопросе и как к нему подступиться на собеседовании.
2Решение
`constexpr`-функция может выполняться во время компиляции (если вызов в constexpr-контексте) или в рантайме. Ограничения смягчались по версиям.
// C++14+: локальные переменные, if/for, return в любом месте
constexpr int fact(int n) {
int r = 1;
for (int i = 2; i <= n; ++i) r *= i;
return r;
}
static_assert(fact(5) == 120); // compile-time
int x = fact(std::rand() % 10); // runtimeЭволюция ограничений:
- C++11: один
return, минимум логики; - C++14:
if/for/while, локальные переменные; - C++20:
try/catch,constexprstd::vector/std::string, dynamic_cast; - C++23:
goto, static-переменные.
Все вызываемые функции и типы должны быть constexpr/literal types.
3Как отвечать
- Сначала уточните условия и ограничения, покажите аналитическое мышление.
- Рассуждайте вслух — интервьюеру важен ход мысли, а не только финальный ответ.
- Оцените сложность по времени и памяти (Big-O), если это алгоритмический вопрос.
💡
На реальном собеседовании Alffert подскажет развёрнутый ответ в реальном времени.