微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如果 consteval 需要什么?

如何解决如果 consteval 需要什么?

C++23 将引入 if consteval。这将用于何处以及它与 constexpr if 有何不同?

解决方法

if consteval 检测是否在常量表达式上下文中调用了 constexpr 函数。 proposal 是为了从 consteval 函数调用 constexpr 函数的情况而引入的。为了理解这意味着什么,我们考虑以下示例。

假设我们有一个 consteval 函数 f

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

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

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

如果在常量表达式中调用 if consteval,则 //1 行中的 g 会触发。 请注意,//1 中不能有条件。 if consteval 后面的大括号也是必须的。

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。