В исходном примере 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.