为什么_Alignof在关于将数组转换为指针的规则中缺失?

C 2011(草案N1570)6.3.2.1 3说:

除非它是sizeof运算符, _Alignof运算符或一元运算符的操作数,或者是用于初始化数组的字符串文字,否则具有类型”数组类型 ”的表达式将转换为表达式输入”指向类型’的指针,指向数组对象的初始元素,而不是左值。 如果数组对象具有寄存器存储类,则行为未定义。

C 2018 6.3.2.1 3说:

除非它是sizeof运算符或一元运算符的操作数,或者是用于初始化数组的字符串文字,否则将类型为“array of type ”的表达式转换为类型为“指向类型的指针”的表达式指向数组对象的初始元素,而不是左值。 如果数组对象具有寄存器存储类,则行为未定义。

为什么后者缺少_Alignof

C 2018 Foreward 7说:

此版本没有重大变化,只有技术更正和说明。

这意味着从数组转换规则中豁免_Alignof有一些不正确之处,导致它被删除。 但是,应该可以将_Alignof应用于数组,如C 2018 6.5.3.4 3所述:

_Alignof运算符产生其操作数类型的对齐要求。 不评估操作数,结果是整数常量。 应用于数组类型时,结果是元素类型的对齐要求。

在C11和C18标准中, _Alignof运算符可能具有类型名称作为操作数,但不具有表达式。 根据C11标准草案§6.5.3:

 Syntax unary-expression: postfix-expression ++ unary-expression -- unary-expression unary-operator cast-expression sizeof unary-expression sizeof ( type-name ) _Alignof ( type-name ) unary-operator: one of & * + - ~ ! 

sizeof运算符可以使用表达式或带括号的类型名称作为操作数,但由于使用括号类型名称以外的任何内容作为_Alignof的参数是_Alignof ,因此根本不需要数组的特殊exception在这里转换。