普通数组定义中 `alignas` 的有效位置

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

我想了解普通数组定义中不同

alignas
说明符位置的有效性:

constexpr std::size_t Required=16;

alignas(Required) int iarr1[10]; // 1
int alignas(Required) iarr2[10]; // 2
int iarr3 alignas(Required) [10]; // 3
int iarr4 [10] alignas(Required); // 4

2 被 gcc 忽略并带有警告。
2 和 4 给出了明显的错误,并带有 clang LIVE

这个答案解释了为什么 1 是正确的,但不涵盖其他情况,我想了解其他哪些形式可能有效。

据我说:

  • 2 可能是错误的,因为
    alignas
    将被解析为类型 (
    int
    ) 声明的一部分,并且它不能应用于 clang 和 gcc 报告等类型(因此,被 msvc 接受将是一个错误)。
  • 3 可能是正确的,因为它是一个简单声明
    int
    正在形成de decl-specifier-seq,而
    iarr3 alignas(Required) [10]
    似乎是一个有效的noptr-declarator,由一个noptr-declarator+attribute-specifier组成,它本身是一个noptr-declarator,后面是
    [Required]
    再次形成一个noptr-declarator,最终可以解释为* init-declarator-list*。
  • 按照相同的推理思路,
  • 4 可能是正确的(切换
    [Required]
    属性说明符 仍然形成 noptr 声明符);但它被 clang 拒绝了。

哪些分析是正确的以及为什么?


作为记录,上面链接的运行片段:

#include <iostream>

int main() {
    constexpr std::size_t Required = 16;

    alignas(Required) int iarr1[10];

#if defined(__GNUG__)
    int iarr2[10];
#if defined(__clang__)
    std::cout << "clang rejects int alignas(Required) iarr2[10];\n";
#else
    std::cout << "gcc ignore int alignas(Required) iarr2[10]; with warning\n";
#endif
#else
    int alignas(Required) iarr2[10];
#endif

    int iarr3 alignas(Required)[10];

#ifndef __clang__
    int iarr4[10] alignas(Required);
#else
    std::cout << "clang rejects int iarr4[10] alignas(Required);\n";
    int iarr4[10];
#endif

    std::cout << iarr1 << '\n';
    std::cout << iarr2 << '\n';
    std::cout << iarr3 << '\n';
    std::cout << iarr4 << '\n';
}
c++ arrays alignment language-lawyer alignas
1个回答
0
投票

alignas
只能应用于变量、非静态数据成员和类 ([dcl.align]/1[dcl.attr.grammar]/5)。

在您给出的示例中:

因此,1 和 3 是良构的,而 2 和 4 是良构的。

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