GCC 和 MSVC 接受“alignas”,而 Clang 拒绝它

问题描述 投票:0回答:2

我编写了以下使用 GCC 和 MSVC 编译的程序,但 Clang 拒绝了它。程序是:

int a[2] alignas(16) [5]; //GCC: Ok, Clang: No, MSVC: OK

演示

根据最新的 C++ 标准,正确的行为是什么?

c++ language-lawyer
2个回答
3
投票

在您写的位置

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];
    

1
投票

该程序是格式错误,因为dcl.align不允许将

alignas(16)
应用于数组类型(此处为
int[2]
),并且通过示例中的CWG2005
alignas(16)
属于数组类型
int[2]
.

对齐说明符可以应用于变量或类数据成员,但不得应用于位字段、函数参数或异常声明([except.handle])。 对齐说明符也可以应用于类的声明(分别在详细类型说明符([dcl.type.elab])或类头([class])中)。 带有省略号的对齐说明符是包扩展 ([temp.variadic])。

© www.soinside.com 2019 - 2024. All rights reserved.