什么是 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
.
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
.