我想了解普通数组定义中不同
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 是正确的,但不涵盖其他情况,我想了解其他哪些形式可能有效。
据我说:
alignas
将被解析为类型 (int
) 声明的一部分,并且它不能应用于 clang 和 gcc 报告等类型(因此,被 msvc 接受将是一个错误)。int
正在形成de decl-specifier-seq,而iarr3 alignas(Required) [10]
似乎是一个有效的noptr-declarator,由一个noptr-declarator+attribute-specifier组成,它本身是一个noptr-declarator,后面是[Required]
再次形成一个noptr-declarator,最终可以解释为* init-declarator-list*。[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';
}
alignas
只能应用于变量、非静态数据成员和类 ([dcl.align]/1、[dcl.attr.grammar]/5)。
在您给出的示例中:
iarr1
([dcl.pre]/4),int
([dcl.spec.general]/1),iarr3
([dcl.meaning.general]/1),int[10]
([dcl.array]/3)。因此,1 和 3 是良构的,而 2 和 4 是良构的。