Разрешен ли восточный constexpr / constinit / consteval в C ++ 20? - PullRequest
4 голосов
/ 20 сентября 2019

Большинство примеров, которые я нашел в Интернете, предпочитали «западный стиль» для 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; 

Для ясности: я не собираюсь начинать языковую войну "запад" / "восток".Меня не интересуют мнения, просто факты, тем более что версии clang и gcc head на wandbox в данный момент дают ошибки, но не отвечают на constinit / consteval.

1 Ответ

4 голосов
/ 20 сентября 2019

Сортировка.

Это часть decl-specier-seq , и спецификаторы в ней могут быть в любом порядке.Это то же правило, которое позволяет вам писать volatile int static long unsigned inline long const x = 1;

Но оно не является частью декларатора (в частности, ptr-operator ), поэтомуВы не можете сделать int* constexpr x = nullptr;.

...