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的调用可以如下完成。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 回答