C2x:如果 _Alignof(array type) 产生元素类型的对齐,那么允许 _Alignof(incomplete array type) 是否有用?

C2x: if _Alignof(array type) yields the alignment of the element type, then will it be useful to permit _Alignof(incomplete array type)?

此代码无效:

int x = _Alignof(int[]);

注意:GCC 产生:

error: invalid application of '__alignof__' to incomplete type 'int[]'

当 Clang 产生时:

<nothing>

每个语义(添加了重点):

When applied to an array type, the result is the alignment requirement of the element type.

但是,为了满足元素类型的对齐要求,不需要大小。

因此,通过更改约束使上述代码有效是否有用

来自:

The _Alignof operator shall not be applied to a function type or an incomplete type.

至(强调):

The _Alignof operator shall not be applied to a function type or an incomplete non-array type.

C2x: if _Alignof(array type) yields the alignment of the element type, then will it be useful to permit _Alignof(incomplete array type)?

如您所见,语言规范明确禁止将 _Alignof 运算符应用于不完整类型的表达式或此类类型的括号名称。这是一种语言约束,因此实现诊断违规是一种一致性要求,从这个意义上讲,Clang 的行为是 non-conforming.

另一方面,您是对的,当所讨论的类型是具有完整元素类型但未指定元素数量的数组类型时,有机会实现完全一致的 _Alignof 行为。数组中元素的数量不是其对齐要求的一个因素,所以这个操作可以根据普通的 _Alignof 语义来解决,只要规范允许它。

有用吗?我敢肯定,这取决于人们考虑的可能用途范围。我不觉得 _Alignof 一般而言非常有用,尽管它确实有它的时刻。并且由于您可以直接从其元素类型获取数组类型的对齐方式,因此您不需要 _Alignof 数组类型 - 完整或不完整 - 除非在您不知道什么类型的地方操作。这并没有排除 all 可能的用途,但它留下的 window 足够小,我认为规范表达它所做的更简单的约束并不是不合理的而不是允许 _Alignof 在这个不完整类型的特殊 class 上需要的更复杂的。