1

您可以在 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);
}

[直播]

4

1 回答 1

3

这是论据。constexpr函数不需要被不断评估。这意味着n不能在常量表达式中使用。

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

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

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

于 2020-08-13T10:43:43.470 回答