为什么 constexpr 函数不能使用 consteval 函数,而您可以从 consteval 函数创建 constexpr 对象?

How come constexpr functions can not consume consteval functions while you can create constexpr objects from consteval functions?

您可以从 consteval 获得 constexpr 对象 但您不能在 constexpr 中使用 consteval。

为什么?

我认为 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);
}

[LIVE]

这是争论。 constexpr 函数不需要进行常量计算。这意味着 n 不能用于常量表达式。

I thought consteval should have been some kind of "narrow" constexpr.

不,这些只是 需要不断计算的函数。这意味着它们的参数必须始终可用于常量表达式。

您可以使用在常量表达式中不可用的参数调用 constexpr 函数,只要您不在需要常量表达式的上下文中,它仍然是 well-formed .