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, constexpr std::vector/std::string, dynamic_cast;
  • C++23: goto, static-переменные.

Все вызываемые функции и типы должны быть constexpr/literal types.

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

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

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