12

C++23 将引入if consteval. 这将在哪里使用,它与 有何不同constexpr if

4

1 回答 1

13

if consteval检测是否constexpr在常量表达式上下文中调用函数。该提案consteval促使其针对打算从函数调用函数的情况引入constexpr。为了理解这意味着什么,我们考虑以下示例。

假设我们有一个consteval函数f

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

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

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

此处if consteval的 in line//1触发器 ifg在常量表达式中被调用。请注意, 中必须没有条件//1。后面的大括号if consteval也是必须的。

引入 C++20is_constant_evaluated以检测函数调用是否发生在常量评估的上下文中。在我们的示例中使用is_constant_evaluated会导致一个微妙的错误。//1即按if constexpr (std::is_constant_evaluated()) {结果交换is_constant_evaluated以始终返回true

于 2021-07-01T15:29:07.627 回答