Почему функции 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 функция с аргументами, которые нельзя использовать в постоянном выражении, и пока вы не находитесь в контексте, требующем постоянного выражения, она по-прежнему правильно сформирована.

Другие вопросы по тегам