此代码无效:
int x = _Alignof(int[]);注: GCC制作:
error: invalid application of '__alignof__' to incomplete type 'int[]'当Clang生产:
<nothing>按语义学(强调后加):
应用于数组类型时,结果是元素类型的对齐要求。
但是,为了满足元素类型的对齐要求,不需要大小。
因此,通过更改约束使上述代码有效是否有用?
发自:
_Alignof运算符不应应用于函数类型或不完全类型。
致(强调后加):
_Alignof运算符不应应用于函数类型或不完整的非数组类型.
发布于 2022-03-06 14:58:54
C2x:如果_Alignof(数组类型)产生元素类型的对齐,那么允许_Alignof(不完全数组类型)会有用吗?
正如您所观察到的,语言规范明确禁止将_Alignof运算符应用于不完全类型的表达式或此类类型的括号大小的名称。这是一个语言约束,所以实现诊断违规是一个一致性要求,从这个意义上讲,Clang的行为是不一致的。
另一方面,当所讨论的类型是一个具有完整元素类型但元素数量未指定的数组类型时,您就有了一个完全一致的_Alignof行为的机会。数组中的元素数并不是其对齐要求的一个因素,因此这个操作可以根据普通的_Alignof语义来解决,前提是规范允许它。
会有用吗?我相信这取决于你考虑的可能用途的范围。我不认为_Alignof在一般情况下很有用,尽管它确实有它的时刻。而且,由于可以直接从数组类型的元素类型获得数组类型的对齐,所以数组类型不需要_Alignof --不管是否完整--除非在不知道将对哪种类型进行操作的地方。这并不能消除所有可能的用途,但它留下的窗口足够小,因此我不认为规范表示它所做的更简单的约束是不合理的,而不是需要更复杂的约束来允许_Alignof在这一类特殊的不完全类型上使用。
https://stackoverflow.com/questions/71371199
复制相似问题