为什么alignas()不带参数包?

时间:2019-04-16 12:14:22

标签: c++ c++11 visual-c++ g++ clang++

根据cppreference.com


alignas说明符(自C ++ 11起)

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

语法

alignas(表达式
alignas( type-id
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,因此似乎是一个缺陷,并且编译器尚未解决。

编辑

显然,在cygwin bash shell中运行MinGW的g ++编译器会导致奇怪的行为。在MinGW的bash shell中运行时效果很好。因此,不,这在g ++ 8.2下也不起作用。

1 个答案:

答案 0 :(得分:2)

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

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

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