c++ - 如果需要 consteval 怎么办?

标签 c++ constexpr consteval c++23

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 .

关于c++ - 如果需要 consteval 怎么办?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68213012/

相关文章:

c++ - 为什么我不能用大括号括起来的初始化列表构造队列/堆栈? (C++11)

c++ - 模板函数 : perform conversion based on typename

c++ - 裁剪函数 BitBlt(...)

c++ - std::chrono::high_resolution_clock 不准确?

C++11 constexpr 函数的参数传入模板参数

c++ - `inline` 和 `noexcept` 在 consteval 上下文中是多余的吗?

c++ - 将 constexpr 特化声明为 friend

c++ - 字符串文字可以在常量表达式中下标吗?

c++ - 使用 consteval 代替 constexpr 函数有什么优点?

c++ - 如何保证使用编译时常量初始化堆栈变量