东康斯泰克普/康斯蒂尼特/康斯特瓦尔在C++20 中允许吗?

Is east constexpr / constinit / consteval allowed in C++20?

本文关键字:C++20 许吗 康斯特 康斯泰 康斯蒂      更新时间:2023-10-16

我在网上找到的大多数例子都更喜欢constexpr(C++11(、constevalconstinit(C++20(的"西式":

consteval auto sqr(int n) {
return n*n;
}
constexpr auto r = sqr(100);  // OK
constinit static auto x = r; 

由于我不是语言律师,我有以下问题: 这些说明符是否允许使用"东方风格"?例:

auto consteval sqr(int n) {
return n*n;
}
auto constexpr r = sqr(100);  // OK
static auto constinit x = r; 

需要明确的是:我无意发动一场"西方"/"东方"的语言战争。我对意见不感兴趣,只对事实感兴趣,尤其是此时魔杖盒上的 clang 和 gcc 头版本给出了错误,但没有关于constinit/consteval的答案.

有点。

它是decl-specifier-seq的一部分,其中的说明符可以按任何顺序排列。这是允许您编写volatile int static long unsigned inline long const x = 1;的相同规则

但它不是声明符的一部分(特别是ptr 运算符(,所以你不能int* constexpr x = nullptr;.