变量上的 consteval 与 constexpr

Ion*_*dru 0 c++ constexpr c++11 c++20 consteval

有什么区别constexprconsteval

 consteval int x1 = 2;
 constexpr int x2 = 5;
Run Code Online (Sandbox Code Playgroud)

使用 constexpr 比使用 consteval 更好吗?

Pau*_*ers 10

标准实际上说:

consteval 说明符应仅应用于函数或函数模板的声明。

所以你的第一个例子不应该编译


但是,您可以放置constevalconstexpr打开函数:

constexpr int foo (int x) { return x; }
consteval int bar (int x) { return x; }
Run Code Online (Sandbox Code Playgroud)

constexpr 当应用于函数时只是建议性的 - 它告诉编译器,如果可以的话,在编译时评估这个函数调用。

consteval,另一方面,是强制性的 - 它告诉编译器,如果您无法在编译时评估此函数调用,则会生成错误。

现场演示

  • 函数上的“constexpr”不建议使用其返回值作为模板参数“需要”编译时评估(*即*,解释器除外)。 (2认同)
  • 我刚刚找到了 R. Smith、Andrew Sutton 和 Daveed Vandervoorde 撰写的这篇论文 [P1073R3](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p1073r3.html)。感谢您回复我的评论。 (2认同)