C++23 将引入if consteval
. 这将在哪里使用,它与 有何不同constexpr if
?
问问题
1242 次
1 回答
13
if consteval
检测是否constexpr
在常量表达式上下文中调用函数。该提案consteval
促使其针对打算从函数调用函数的情况引入constexpr
。为了理解这意味着什么,我们考虑以下示例。
假设我们有一个consteval
函数f
:
consteval int f( int i )
{ ... }
f
只能在常量表达式中调用。另一方面,可以在常量表达式中或在运行时调用constexpr
函数。g
这取决于参数g
是否在编译时已知。现在,在编译时调用iff
的调用可以如下完成。g
g
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 回答