什么是 if consteval 需要?

What is if consteval needed for?

C++23即将推出if consteval。这将在哪里使用,它与 constexpr if 有何不同?

if consteval 检测是否在常量表达式上下文中调用了 constexpr 函数。 proposal 激发了它的引入,以用于打算从 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,则

//1 中的 if consteval 会触发。 注意//1中不能有条件。 if consteval 之后的大括号也是必须的。

C++20 引入了 is_constant_evaluated 用于检测函数调用是否发生在常量计算的上下文中。在我们的示例中使用 is_constant_evaluated 会导致一个微妙的错误。 IE。用 if constexpr (std::is_constant_evaluated()) { 交换 //1 导致 is_constant_evaluated 总是 return true.