Почему функции constexpr не могут использовать функции consteval, в то время как вы можете создавать объекты constexpr из функций consteval?
У вас могут быть объекты constexpr перед consteval, но вы не можете использовать consteval внутри constexpr.
Почему?
Я думал, что consteval должен быть своего рода "узким" constexpr.
Пожалуйста, помогите мне разобраться в этом дизайне.
constexpr int constexpr_sqr(int n) { return n*n; }
consteval int consteval_sqr(int n) { return n*n; }
constexpr int constexpr_sqr2(int n) {
// not allowed
// return consteval_sqr(n);
// not allowed
// constexpr imm = consteval_sqr(n);
// return imm;
return constexpr_sqr(n);
}
int main() {
// while can do this
constexpr auto imm = consteval_sqr(999);
}
[В РЕЖИМЕ]
1 ответ
Это аргумент. constexpr
функция не требует постоянного вычисления. Это значит, чтоn
не может использоваться в постоянном выражении.
Я думал, что consteval должен быть своего рода "узким" const expr.
Нет, это просто функции, которые нужно постоянно оценивать. Это означает, что их аргументы всегда должны использоваться в постоянных выражениях.
Вы можете позвонить constexpr
функция с аргументами, которые нельзя использовать в постоянном выражении, и пока вы не находитесь в контексте, требующем постоянного выражения, она по-прежнему правильно сформирована.