Почему alignas () не принимает пакет параметров? - PullRequest
5 голосов
/ 16 апреля 2019

Согласно cppreference.com


спецификатор alignas (начиная с C ++ 11)

Указывает требование выравнивания для типа или объекта.

Синтаксис

alignas ( выражение )
alignas ( идентификатор типа )
alignas ( pack ... )

  1. alignas(expression) должно быть целочисленным константным выражением с нулевым значением илидопустимое значение для выравнивания или расширенного выравнивания.

  2. Эквивалентно alignas(alignof(type))

  3. Эквивалентно нескольким спецификаторам alignas, примененным к одному и тому же объявлению, одиндля каждого члена пакета параметров, который может быть как типовым, так и нетиповым пакетом параметров.


Так почему же следующее не работает для g ++, clang или VC ++?

struct alignas(1, 4) A {};

или

struct alignas(int, double) A {};

Это дефект?

Редактировать

Видимо, это работает дляg ++ 8.2 и не для clang ++ 8.0 или VC ++ 19.20.27508.1, таким образом, кажется дефектом, и компиляторы не догнали.

Редактировать

Очевидно, что запуск компилятора MinGW g ++ в оболочке cygwin bash вызывает странное поведение,Прекрасно работает при запуске в оболочке bash MinGW.Так что нет, это не работает и в g ++ 8.2.

1 Ответ

2 голосов
/ 16 апреля 2019

1, 4 или int, double не являются пакетами параметров. Это будет пример пакета параметров, используемого в этом контексте:

template <class... T>
struct Widget
{
  struct alignas(T...) A {};
};

Обратите внимание, что к одному объявлению можно применить несколько alignas спецификаторов, поэтому ваши примеры можно записать как alignas(1) alignas(4) и alignas(int) alignas(double) соответственно.

...