为什么 alignas() 不采用参数包?

Why isn't alignas() taking a parameter pack?

根据cppreference.com


对齐说明符 (C++11 起)

指定类型或对象的对齐要求。

语法

alignas(表达式)
alignas( 类型-id )
alignas(包...)

  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 所以似乎是一个缺陷,编译器还没有赶上。

编辑

显然,运行 Cygwin bash shell 中的 MinGW 的 g++ 编译器会导致奇怪的行为。在 MinGW 的 bash shell 中 运行 时工作正常。所以,不,这在 g++ 8.2 下也不起作用。

1, 4int, double 不是参数包。这将是在此上下文中使用的参数包的示例:

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

请注意,可以将多个 alignas 说明符应用于同一声明,因此您的示例可以分别写为 alignas(1) alignas(4)alignas(int) alignas(double)