constexpr разрешает вычисление функции на этапе компиляции, но не требует этого для каждого вызова. Инициализация constexpr result обязана быть константной; обычный вызов в cout такой гарантии не имеет.
Определение времени вычисления: компиляция vs выполнение
constexpr разрешает вычисление функции на этапе компиляции, но не требует этого для каждого вызова. Инициализация constexpr result обязана быть константной; обычный вызов в cout такой гарантии не имеет.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Нужно выяснить, какие части приведённого кода будут вычислены на этапе компиляции, а какие — во время выполнения.
constexpr int constFact(unsigned value) {
if (value == 0) {
return 1;
}
return constFact(value - 1) * value;
}
std::cout << constFact(5) << std::endl;
constexpr int result = constFact(5);
std::cout << result << std::endl;
Ответ
constexpr разрешает вычисление функции на этапе компиляции, но не требует этого для каждого вызова. Инициализация constexpr result обязана быть константной; обычный вызов в cout такой гарантии не имеет.
В первом выражении компилятор может заранее получить 120 как оптимизацию, но язык допускает вычисление при выполнении. Во втором значение result должно быть вычислимо как константное выражение.
Обе операции вывода выполняются во время работы программы и печатают 120. Для больших аргументов отдельно нужно учитывать диапазон возвращаемого int; наличие constexpr не делает арифметику бесконечно точной.
Источник: eel.is.