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
& * + - ~ !
Run Code Online (Sandbox Code Playgroud)
该sizeof运营商可能是表达式或带括号的类型名称作为操作数,但因为它是作为参数来约束违规使用比带括号的类型名称以外的其他_Alignof,根本就没有必要在这里阵列转换的特例.