我编写了以下使用 GCC 和 MSVC 编译的程序,但 Clang 拒绝了它。程序是:
int a[2] alignas(16) [5]; //GCC: Ok, Clang: No, MSVC: OK
根据最新的 C++ 标准,正确的行为是什么?
在您写的位置
alignas(16)
它属于内部数组类型(而不是声明的变量)。 alignas(16)
不能应用于数组类型(或声明的类之外的任何类型),因此,正如 CWG 2205 所阐明的,它的格式不正确。叮当是正确的。
alignas(16)
只能应用于变量、类数据成员或类的声明。除了最后一个例外,它根本不适用于类型。
重要的是,
alignas
永远不会成为类型的一部分,并且在类型系统中没有任何意义。它不是类型说明符。这可能与非标准 alignas
属性(例如 __attribute__((aligned(...)))
)的某些实现不同,后者可能被视为类型系统的一部分,类似于例如const
类型说明符。在这种情况下,能够将其应用于变量声明中的类型而不是变量本身是有意义的。
顺便说一句,
alignas
属于变量本身的位置:
在声明的开头,它属于该声明所声明的每个实体(因为您可以在一个声明中声明多个变量和函数):
alignas(16) int a[2][5];
紧接在declarator-id之后,即所声明的变量的名称,在这种情况下,如果在同一个声明中声明了多个实体,则它仅属于该变量:
int a alignas(16) [2][5];