当您可以从consteval函数创建constexpr对象时,为什么constexpr函数不能消耗consteval函数?

问题描述

您可以在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在常量表达式中不可用。

我认为consteval应该是某种“狭窄的” constexpr。

不,这些只是必须要不断评估的函数。这意味着它们的参数必须始终在常量表达式中可用。

您可以使用在常量表达式中不可用的参数来调用constexpr函数,只要您不在需要常量表达式的上下文中,它的格式仍然正确。