首页 > 解决方案 > C++20 中是否允许使用east constexpr / constinit / consteval?

问题描述

我在网上找到的大多数示例都更喜欢constexpr(C++11) consteval、和constinit(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; 

需要明确的是:我无意发动“西方”/“东方”语言战争。我对意见不感兴趣,只是对事实感兴趣,尤其是目前 wandbox 上的 clang 和 gcc head 版本给出错误但在constinit/上没有答案consteval

标签: c++c++20

解决方案


有点。

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

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


推荐阅读