如何解决如果 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 举报,一经查实,本站将立刻删除。