Компиляционное вычисление факториала

В исходном примере constexpr result уже требует константного вычисления. Если нужно запретить обычные runtime-вызовы самой функции, в C++20 используется consteval.

Короткий ответ

Что ответить на собеседовании

В исходном примере constexpr result уже требует константного вычисления. Если нужно запретить обычные runtime-вызовы самой функции, в C++20 используется consteval.

Подробный разбор

Ответ с пояснениями

Условие

Перепишите рекурсивную constexpr‑функцию, отвечающую за вычисление факториала, так, чтобы её результат был получен уже на этапе компиляции, независимо от того, насколько запутан вызов функции.

constexpr int computeFactorial(unsigned n) {
    return n == 0 ? 1 : n * computeFactorial(n - 1);
}

constexpr int result = computeFactorial(5);
static_assert(result == 120); // проверка во время компиляции

Ответ

В исходном примере constexpr result уже требует константного вычисления. Если нужно запретить обычные runtime-вызовы самой функции, в C++20 используется consteval.

consteval int computeFactorial(unsigned n) {
    return n == 0 ? 1 : n * computeFactorial(n - 1);
}

constexpr int result = computeFactorial(5);
static_assert(result == 120);

Для 5 результат равен 120. Передать произвольное значение, известное только во время выполнения, и всё равно вычислить его при компиляции невозможно: такой вызов будет отклонён. consteval не снимает ограничения диапазона int; для больших аргументов требуется отдельная проверка переполнения.

Источник: eel.is.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее