如果需要consteval是用来做什么的?

20

C++23将引入if consteval。它将用于哪些场景,它与constexpr if有何不同?

1个回答

26

if consteval可以检测一个constexpr函数在常量表达式上下文中被调用的情况。该提案说明了它被引入的动机,用于意图从constexpr函数中调用consteval函数的情况。为了理解这意味着什么,我们考虑以下示例。

假设我们有一个consteval函数f

consteval int f( int i )
{ ... }

f只能在常量表达式中调用。另一方面,constexpr函数g可以在常量表达式或运行时调用,这取决于是否在编译时已知g的参数。 如果在编译时已知g的参数,则可以按以下方式从g中调用f

constexpr int g( int i )
{
  if consteval {    //1
    return f( i );
  }
  else { 
    return fallback();
  }
}

在代码中,如果在常量表达式中调用函数g,则位于//1if consteval将被触发。 请注意,//1处必须没有条件语句。此外,if consteval后面的花括号是强制性的。

C++20引入了is_constant_evaluated以检测函数调用是否发生在常量求值上下文中。在我们的例子中使用is_constant_evaluated会导致一个微妙的错误。即通过将//1替换为if constexpr (std::is_constant_evaluated()) {,结果is_constant_evaluated总是返回true


1
这是因为is_constant_evaluated并不提供有关g()整个函数体的信息,而是提供了if constexpr控制表达式的信息。 - Ben Voigt
16
问题并不是 if constexpr (is_constant_evaluated()) 有问题(虽然它确实有问题,但编译器会发出警告,所以无所谓),而是即使使用 if (is_constant_evaluated()),你也不能在那里调用 f(i) - Barry
1
constexpr函数的特点是它们的constexpr属性不仅取决于它们的参数,还取决于它们被调用的上下文环境。is_constant_evaluated() 喜欢 constexpr int x = f(5); 但不喜欢 int x = f(5); - klaus triendl
2
这段程序相关的内容是:为什么我们至少不能做到这一点呢?constexpr int g(int i) { if consteval { static_assert(i < ...);... }...} 如果我们知道某些内容在编译时评估,为什么不相应地处理这些值呢? - Alex Vask
好主意,Alex。 - rplgn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接